The notion of type is a very abstract one. Some notion of type is
present in most object-oriented languages, and paradigms (e.g. design
methodologies, frameworks, etc.). One often attempts to define it in a
common, "abstract", "language-independent" (or language neutral) way.
I claim that any such attempt is doomed.
To support this strong claim, I will try to show what is a type in C++, what must be a type for the notion to be useful.
Other related ideas:
C++ types attempt to be upward compatible with C types (aka built-in types).
Typing is used as a mean to express semantics in a form which can be processed (and thus supported) by a tool (in C++: the compiler). I.e. typing competes with other such means: Eiffel assertions, Ada tasks, various formal techniques (annotation, decoration, etc.). C++ attempts to allow the design to make them as strong as possible (expressivity), to keep them static (modularity), and to avoid duplication of information.