あえて単純な例を選んだからだろうけど、
単純すぎて、どう堅牢性が上がっているのかも分からないし、
コンパイラが十分賢ければ、同じコードがでるんでは、という気が。

あと後者のほうは、
newVec2 x y = (x, y)
getX = fst
getY = snd
v0 `add` v1 = newVec2 (getX v0 + getX v1) (getY v0 + getY v1)
で十分だよね。