diff --git a/minijson.pyx b/minijson.pyx
index 44ba8c6791c9b91e11431230c4cb78df50b793f7..4fde182c10eeffaed9f0037f2e335c7ff60c8245 100644
--- a/minijson.pyx
+++ b/minijson.pyx
@@ -408,13 +408,10 @@ cpdef int dump(object data, cio: io.BytesIO) except -1:
                 cio.write(b'\x12')
                 cio.write(STRUCT_L.pack(length))
                 length = 5
-            try:
-                for field_name, elem in data.items():
-                    cio.write(bytearray([len(field_name)]))
-                    cio.write(field_name.encode('utf-8'))
-                    length += dump(elem, cio)
-            except TypeError as e:
-                raise EncodingError('Keys have to be strings!') from e
+            for field_name, elem in data.items():
+                cio.write(bytearray([len(field_name)]))
+                cio.write(field_name.encode('utf-8'))
+                length += dump(elem, cio)
             return length
         else:
             if length <= 0xF:
@@ -432,7 +429,7 @@ cpdef int dump(object data, cio: io.BytesIO) except -1:
                 cio.write(STRUCT_L.pack(length))
                 offset = 5
             else:
-                raise EncodingError('Too long of a string!')
+                raise EncodingError('Too long of a sdict!')
 
             for key, value in data.items():
                 offset += dump(key, cio)
diff --git a/tests/test_minijson.py b/tests/test_minijson.py
index 8e78e3c6fae88a41f7c8c1f4778c6afcb4c34e7c..8181d05ef0f1af95be072d76edb06360ae468ea6 100644
--- a/tests/test_minijson.py
+++ b/tests/test_minijson.py
@@ -50,6 +50,13 @@ class TestMiniJSON(unittest.TestCase):
         self.assertSameAfterDumpsAndLoads(c)
         self.assertSameAfterDumpsAndLoads(d)
 
+    def test_too_long_string(self):
+        class Test(str):
+            def __len__(self):
+                return 0x1FFFFFFFF
+
+        self.assertRaises(EncodingError, lambda: dumps(Test()))
+
     def test_lists(self):
         a = [None]*4
         self.assertSameAfterDumpsAndLoads(a)
@@ -87,11 +94,19 @@ class TestMiniJSON(unittest.TestCase):
         a = list(range(0x1FFFF))
         self.assertSameAfterDumpsAndLoads(a)
 
+    def test_weird_dict(self):
+        key = 'a'*300
+        a = {key: 2}
+        self.assertSameAfterDumpsAndLoads(a)
+
     def test_negatives(self):
         self.assertSameAfterDumpsAndLoads(-1)
         self.assertSameAfterDumpsAndLoads(-259)
         self.assertSameAfterDumpsAndLoads(-0x7FFF)
         self.assertSameAfterDumpsAndLoads(-0xFFFF)
+        self.assertSameAfterDumpsAndLoads(0x1FFFF)
+        self.assertSameAfterDumpsAndLoads(0x1FFFFFF)
+        self.assertRaises(EncodingError, lambda: dumps(0xFFFFFFFFF))
 
     def test_dumps(self):
         v = {"name": "land", "operator_id": "dupa", "parameters":
@@ -99,8 +114,10 @@ class TestMiniJSON(unittest.TestCase):
         self.assertSameAfterDumpsAndLoads(v)
 
     def test_loads_exception(self):
-        b = b'\x1F'
-        self.assertRaises(DecodingError, lambda: loads(b))
+        self.assertRaises(DecodingError, lambda: loads(b'\x1F'))
+        self.assertRaises(DecodingError, lambda: loads(b'\x00\x01'))
+        self.assertRaises(DecodingError, lambda: loads(b'\x00\x01\xFF'))
+        self.assertRaises(DecodingError, lambda: loads(b'\x81\xFF'))
 
     def test_loads(self):
         a = loads(b'\x0B\x03\x04name\x84land\x0Boperator_id\x84dupa\x0Aparameters\x0B\x03\x03lat\x09B4\xeb\x85\x03lon\x09B[33\x03alt\x09Cj\x00\x00')