Providing some specific details would make your argument a lot more convincing.
Python 2:
>>> class OldStyleClass: pass
>>> isinstance(OldStyleClass, type)
False
>>> class NewStyleClass(object): pass
>>> isinstance(NewStyleClass, type)
True
Python 3: >>> class Class: pass
>>> isinstance(Class, type)
True
Old-style classes were kind of their own thing in their own space, but with new-style classes, classes are to `type` as instances are to `object`, and I don’t recall there being any major 2/3 difference beyond the simple removal of old-style classes. >>> type(type)
<type 'type'>
Python3: >>> type(type)
<class 'type'>(This change was introduced in Python 3.0a5, bug #2565. Looking at the bug, this is a followup of making the type() of new style classes be reported as 'class ...', but preserving old behavior of type() for built-ins, done in 2001.)
I'm pretty sure the word "class" here comes from the repr for types, in Objects/typeobject.c :
static PyObject *
type_repr(PyTypeObject *type)
{
...
if (mod != NULL && !_PyUnicode_EqualToASCIIId(mod, &PyId_builtins))
rtn = PyUnicode_FromFormat("<class '%U.%U'>", mod, name);
else
rtn = PyUnicode_FromFormat("<class '%s'>", type->tp_name);
...
which is used later on when defining the "type" type: PyTypeObject PyType_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"type", /* tp_name */
...
(reprfunc)type_repr, /* tp_repr */
That is, Python 3 has no actual "class" type, so it's not correct to say that '"type" is an instance of "class."'(I could be wrong - I'm no expert at the Python internals.)
As a minor note, in Python 2, types.ClassType was a "thing":
>>> import types
>>> types.ClassType is type
False
>>> isinstance(types.ClassType, type)
True
>>> my_class = types.ClassType("spam", bases=(), dict={})
>>> my_class
<class __main__.spam at 0x106732670>
I don't remember the details any more, but it looks like it was the base for class for old-style classes. Using your class definitions: >>> isinstance(OldStyleClass, types.ClassType)
True
>>> isinstance(NewStyleClass, types.ClassType)
False
Python 3 replaced that functionality with types.new_class(), which returns an instance of type 'type': >>> my_class = types.new_class("spam")
>>> isinstance(my_class, type)
True
>>> my_class
<class 'types.spam'>
>>> type(my_class)
<class 'type'>
As I recall, in the early 1.x days it wasn't apparent that the class/type dichotomy was a problem. It took a lot of work during the 2.x era to bring them together.