="constraints"
="rules"
="policies"
="contracts"
="semantics" (separate concept of MEANING from underlying DATA BIT representations)
="compatible semantics"
="capabilities"
="propositions" (and functions can be "theorem proofs")
="facts" about code that compiler attempts to "prove"
="tags" or "metatags" for compiler checking
="documentation" that's enforced by compiler specify what is NOT ALLOWED e.g. "you can't do that"
="substitution", "compatibility"
="A set of rules for how to semantically treat a region of memory."
Because the list is synonyms, many concepts overlap. In my mind, the highest level of unification about "types" is the concept of "constraints". Related topics such as polymorphism is a practical syntax pattern that arises from data types' constraints.
Personal anecdote: I initially learned an incomplete and misleading idea about "types" from K&R's "The C Programming Language". From that book, I thought of "types" as different data widths (or magnitudes). An "int" held 16bits and a "long" held 32 bits, etc.
It was later exposure to more sophisticated programming languages that a much richer expressiveness of "types" is possible that the C Language "typedef" cannot accomplish. For instance, if want a "type" called "month", I could encode a "rule" or "constraint" that valid values are 0 through 11 (or 1 to 12). A plain "int" is -32768..+32767 and having "typedef int month;" provides a synonym but not a new policy enforceable by the compiler.