We introduce and discuss a number of common issues associated with types and type checking in programming languages: static vs dynamic type checking, implicit and explicit type conversions, widening and narrowing conversions, name vs structural type compatibility