какой-нибудь
nominal type Value = Int
и чтобы в пределах модуля Value и Int коерсились неявно, пушто это просто алиас, а в других модулях уже нет
такой синтаксис правда еще больше увеличил бы число тайп-аннотаций, да и id-функций пришлось бы больше писать и экспортировать, так что уж лучше такой как есть.
Хотя с другой стороны кода от аннотации не сильно больше, но это пока параметров нет
f :: Value -> a
g :: Int -> a
g x = f (x :: Value)
и
g x = f (Value x)
а когда нужно будет полиморфную функцию вызывать, придется все аннотировать явно в каждом месте для обоих типов
но никаких конструкторов нет при этом, а единственность значения тут чисто из-за того, что алиас не может быть на большее число типов чем 1
пусть роли явно расставляют в таком случае