Change repr() of a new-style class to say <class 'ClassName'> rather
than <type 'ClassName'>.  Exception: if it's a built-in type or an
extension type, continue to call it <type 'ClassName>.  Call me a
wimp, but I don't want to break more user code than necessary.
diff --git a/Lib/test/test_descrtut.py b/Lib/test/test_descrtut.py
index e72567d..a0de4cc 100644
--- a/Lib/test/test_descrtut.py
+++ b/Lib/test/test_descrtut.py
@@ -37,16 +37,16 @@
 Here's the new type at work:
 
     >>> print defaultdict               # show our type
-    <type 'test.test_descrtut.defaultdict'>
+    <class 'test.test_descrtut.defaultdict'>
     >>> print type(defaultdict)         # its metatype
     <type 'type'>
     >>> a = defaultdict(default=0.0)    # create an instance
     >>> print a                         # show the instance
     {}
     >>> print type(a)                   # show its type
-    <type 'test.test_descrtut.defaultdict'>
+    <class 'test.test_descrtut.defaultdict'>
     >>> print a.__class__               # show its class
-    <type 'test.test_descrtut.defaultdict'>
+    <class 'test.test_descrtut.defaultdict'>
     >>> print type(a) is a.__class__    # its type is its class
     1
     >>> a[1] = 3.25                     # modify the instance
diff --git a/Lib/test/test_repr.py b/Lib/test/test_repr.py
index b7d9374..1c63e4d 100644
--- a/Lib/test/test_repr.py
+++ b/Lib/test/test_repr.py
@@ -208,7 +208,7 @@
 ''')
         from areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation import foo
         eq(repr(foo.foo),
-               "<type 'areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation.foo.foo'>")
+               "<class 'areallylongpackageandmodulenametotestreprtruncation.areallylongpackageandmodulenametotestreprtruncation.foo.foo'>")
 
     def test_object(self):
         # XXX Test the repr of a type with a really long tp_name but with no
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 877a3bd..964164f 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -114,6 +114,7 @@
 type_repr(PyTypeObject *type)
 {
 	PyObject *mod, *name, *rtn;
+	char *kind;
 
 	mod = type_module(type, NULL);
 	if (mod == NULL)
@@ -126,13 +127,19 @@
 	if (name == NULL)
 		return NULL;
 
+	if (type->tp_flags & Py_TPFLAGS_HEAPTYPE)
+		kind = "class";
+	else
+		kind = "type";
+
 	if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__")) {
-		rtn = PyString_FromFormat("<type '%s.%s'>",
+		rtn = PyString_FromFormat("<%s '%s.%s'>",
+					  kind,
 					  PyString_AS_STRING(mod),
 					  PyString_AS_STRING(name));
 	}
 	else
-		rtn = PyString_FromFormat("<type '%s'>", type->tp_name);
+		rtn = PyString_FromFormat("<%s '%s'>", kind, type->tp_name);
 
 	Py_XDECREF(mod);
 	Py_DECREF(name);
@@ -3365,12 +3372,12 @@
 
 	if (su->obj)
 		return PyString_FromFormat(
-			"<super: <type '%s'>, <%s object>>",
+			"<super: <class '%s'>, <%s object>>",
 			su->type ? su->type->tp_name : "NULL",
 			su->obj->ob_type->tp_name);
 	else
 		return PyString_FromFormat(
-			"<super: <type '%s'>, NULL>",
+			"<super: <class '%s'>, NULL>",
 			su->type ? su->type->tp_name : "NULL");
 }