Un type est une collection d'objets quelconques. Par exemple, l'ensemble de tous les entiers forme un type de même que l'ensemble de tous entiers pairs, ou de tous les nombres.
Les types ne sont pas nécessairement mutuellement exclusifs. par exemple, l'ensemble de tous les nombres forme un type, l'ensemble de tous le entiers aussi ; pourtant, le type nombre et le type entier ne sont pas mutuellement exclusifs.
Les types ne sont pas forcément organisés en arborescence non plus. Si on condidère le type des nombres impairs et celui des nombres premiers, on voit que le type nombre premier ne forme pas un sous-type du type entier impair (2 est un nombre premier), et que le type nombre impair ne forme évidemment pas un sous-type du type nombre premier. De même, un vecteur est élément du type tableau d'entiers et du type vecteur ; pourtant le type vecteur ne forme pas un sous-type du type tableau d'entiers ; par exemple, le type vecteur de flottants n'est pas un sous-type du type vecteur ; de même le type tableau d'entiers n'est pas un sous-type du type vecteur car il contient en particulier les tableaux bidimensionnels. Un type qui en mentionne un autre (comme vecteur d'entiers) est un type paramétré.
Les éléments d'un type n'ont pas forcément la même représentation dans la machine. L'union entre les entiers et les vecteurs de caractères forme un type. Ce n'est peut-être pas un type très utile, mais un type néanmoins.
En fait, en programmation orientée-objets, un type est souvent déterminé par les opérations qui sont applicables à un objet de ce type. Un type défini de cette façon est appelé un type abstrait. C'est une notion centrale en programmation orientée-objets en particulier (mais aussi en programmation en général), car il est souhaitable de cacher l'implémentation le plus possible (voir chapitre 27).
Un type qui n'est pas défini par des opérations, mais par la façon dont ses éléments sont stockés en mémoire est appelé un type concret.
Les types n'étant pas mutuellement exclusifs, un objet peut être de plusieurs types. Il est donc possible de déterminer, pour un objet et un type donnés, si l'objet est de ce type. Par contre, il n'est pas forcément possible de déterminer, pour un objet donné, le type de l'objet.