A program that detects type errors, ensuring Type safety in a statically typed language. Often combined with other static semantic checks and processing, such as Overload resolution, Name binding, and checking access restrictions on names. Can be seen as a form of abstract interpretation, where the abstract values are the types, and all operations are defined according to their static semantics (i.e., type signature) rather than their dynamic semantics. C.f. Semantic analysis.