Собственно, для меня "тип" - это ограничения, связанные с объективно существующими возможностями реализации. Например, мне совершенно пофигу на число 65536, но я объявляю свою переменную как UInt16, потому что знаю, что так будет эффективнее. Это не значит, что я реально рассчитываю на значения не больше магической степени двойки.
А вот если мне нужно, чтобы "переменная" имела разумное значение, отражающее приданный мной этой переменной смысл (например, "температура человеческого тела, показываемая термометром") - я использую классы.
Классы - определяют поведение и абстрактный смысл своих инстансов. Типы - по сути способ привести абстракции программной модели к возможностям реального железа.
У меня может в программной модели мотоцикл ездить внутри клетчатой сферы, но процессор и оперативная память не умеют оперировать такими вещами.