Nominal type systems contrast with structural systems, where comparisons are based on the structure of the types in question and do not require explicit declarations.
For example, in C, two struct types with different names in the same translation unit are never considered compatible, even if they have identical field declarations.
However, C also allows a typedef declaration, which introduces an alias for an existing type.
Some nominally-subtyped languages, such as Java and C#, allow classes to be declared final (or sealed in C# terminology), indicating that no further subtyping is permitted.
The cost is a reduced flexibility, as, for example, nominal typing does not allow new super-types to be created without modification of the existing subtypes.