diff --git a/py/objdict.c b/py/objdict.c
index 0a223f7314c975276799c1c335041f4b1a4c35e1..02a2346fdec1d25d25f9aeca257839d73c919823 100644
--- a/py/objdict.c
+++ b/py/objdict.c
@@ -31,6 +31,7 @@
 #include "py/runtime.h"
 #include "py/builtin.h"
 #include "py/objtype.h"
+#include "py/objstr.h"
 
 #define mp_obj_is_dict_type(o) (mp_obj_is_obj(o) && ((mp_obj_base_t*)MP_OBJ_TO_PTR(o))->type->make_new == dict_make_new)
 
@@ -70,7 +71,14 @@ STATIC void dict_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_
             mp_print_str(print, ", ");
         }
         first = false;
+        bool add_quote = MICROPY_PY_UJSON && kind == PRINT_JSON && !mp_obj_is_str_or_bytes(next->key);
+        if (add_quote) {
+            mp_print_str(print, "\"");
+        }
         mp_obj_print_helper(print, next->key, kind);
+        if (add_quote) {
+            mp_print_str(print, "\"");
+        }
         mp_print_str(print, ": ");
         mp_obj_print_helper(print, next->value, kind);
     }
diff --git a/tests/extmod/ujson_dumps.py b/tests/extmod/ujson_dumps.py
index d732718019ee2f305d060406c70cd3580e5ab824..c33126cec646537be3fd795667994b47ea0fdc20 100644
--- a/tests/extmod/ujson_dumps.py
+++ b/tests/extmod/ujson_dumps.py
@@ -26,3 +26,7 @@ print(json.dumps({"a":1}))
 print(json.dumps({"a":(2,[3,None])}))
 print(json.dumps('"quoted"'))
 print(json.dumps('space\n\r\tspace'))
+print(json.dumps({None: -1}))
+print(json.dumps({False: 0}))
+print(json.dumps({True: 1}))
+print(json.dumps({1: 2}))
diff --git a/tests/extmod/ujson_dumps_float.py b/tests/extmod/ujson_dumps_float.py
index e8cceb6f1a533023f2df8a3dd5e830a74e3ac644..40adb1e267548d836688ade91b850adb575718ab 100644
--- a/tests/extmod/ujson_dumps_float.py
+++ b/tests/extmod/ujson_dumps_float.py
@@ -8,3 +8,4 @@ except ImportError:
         raise SystemExit
 
 print(json.dumps(1.2))
+print(json.dumps({1.5: 'hi'}))