bpo-24641: Improved error message for JSON unserializible keys. (#4364)

Also updated an example for default() in the module docstring.
Removed quotes around type name in other error messages.
diff --git a/Lib/json/encoder.py b/Lib/json/encoder.py
index 41a497c..fb083ed 100644
--- a/Lib/json/encoder.py
+++ b/Lib/json/encoder.py
@@ -176,8 +176,8 @@
                 return JSONEncoder.default(self, o)
 
         """
-        raise TypeError("Object of type '%s' is not JSON serializable" %
-                        o.__class__.__name__)
+        raise TypeError(f'Object of type {o.__class__.__name__} '
+                        f'is not JSON serializable')
 
     def encode(self, o):
         """Return a JSON string representation of a Python data structure.
@@ -373,7 +373,8 @@
             elif _skipkeys:
                 continue
             else:
-                raise TypeError("key " + repr(key) + " is not a string")
+                raise TypeError(f'keys must be str, int, float, bool or None, '
+                                f'not {key.__class__.__name__}')
             if first:
                 first = False
             else: