В общем, идея-то в чем, первично понятие типа, как "метки", которая отделяет одни сущности от других.
Причем и правда посрать как они обозначаются на письме, лишь бы ты (компилятор) мог понять, что вот эта запись является
<вот тем-то>. А дальше начинается семантика. Можно определить поведение при 12 + "12", но тогда либо 12 станет строкой
и будет играть по правилам, определенным для оператора сложения для строки, либо учишь строку каститься в число, что
убивает производительность (это то, о чем Дамир говорил). Или запрещаешь такие телодвижения как небезопасные (путь всяких там Haskell).
Так что да, оптимальность + безопасность.