>>282
typeは既存の型の別名を作る。単なる別名であって全く同じ型。だから、例えば、
type String = [Char]
と定義されているとき、
f :: String -> Int
という関数があったら、fを[Char]型の値に適用できる。

newtypeはdataと同じように、既存の型から別の型を作る。
newtype Nat = Nat Int
という定義は、
data Nat = Nat Int
という定義とほぼ同じ意味で、使いかたも同じ。
逆に言うと、newtypeはdataの制限されたバージョンといえる。
具体的には、データ構築子が一つしかなく、その唯一のデータ構築子が
引数を一つだけ取るような代数的データ型(つまり、フィールドが一つしかないレコード)を
実行効率を損なうことなく定義できるようにしたのがnewtype。

従って、オーバーヘッドを気にしないなら、newtypeを使う必要はない。
逆に、特殊な場合を除いて、フィールドが一つしかないレコードは、
全てdataの代わりにnewtypeを使って定義しても良い。