It is, but it freely allows conversion between the aliased types.
typedef int Feet; typedef int Meters; int main() { Feet height = 6; Meters inEngland = height; // <-- OK. :( }
λ> :{
Prelude| type Feet = Int
Prelude| type Metres = Int
Prelude| :}
λ> let a = 5 :: Feet
λ> let b = 4 :: Metres
λ> :t a
a :: Feet
λ> :t b
b :: Metres
λ> a + b
9
λ> let f = id :: Feet -> Feet
λ> f b
4