型推論の問題点

yarv2llvmでちょっとまとまったプログラムを動かしてみようと思い、bm_so_nbody.rb(http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/benchmark/bm_so_nbody.rb?revision=13548&view=markup)を動かそうとしています。
まだ、Rangeオブジェクトをサポートしていないので動かないのですが、それなりに型推論がうまく行っているようです。

x :(VALUE) -> DoubleTy
y :(VALUE) -> DoubleTy
z :(VALUE) -> DoubleTy
vx :(VALUE) -> DoubleTy
vy :(VALUE) -> DoubleTy
vz :(VALUE) -> DoubleTy
mass :(VALUE) -> DoubleTy
x= :(DoubleTy, VALUE) -> DoubleTy
y= :(DoubleTy, VALUE) -> DoubleTy
z= :(DoubleTy, VALUE) -> DoubleTy
vx= :(DoubleTy, VALUE) -> DoubleTy
vy= :(DoubleTy, VALUE) -> DoubleTy
vz= :(DoubleTy, VALUE) -> DoubleTy
move_from_i :(Array of VALUE, Int32Ty, DoubleTy, Int32Ty, VALUE) -> DoubleTy
energy :(Array of VALUE) -> DoubleTy

ひょっとすると、かなり複雑なRubyプログラムでも、特に宣言を入れなくても型推論ができて高速に動かすことができるんじゃないかなと思ってきました。でも、もし型に矛盾が生じた場合直すのが一苦労です。普通に宣言を入れる場合、宣言とそれを使っている場所だけを比べればいいわけです。
一方、型推論の場合は、一見全然関係の無いプログラム中の2つの要素(変数とかリテラルとか戻り値とか)が異なる型だよってことしかわかりません。型推論を行って、型エラーが出た場合、どちらが正しい型なのか(または両方間違っているのか)を考える段階が1つ入り、その段階がプログラムが複雑になると非常に困難になるんじゃないかなと思います。

型推論を利用するコンパイラを作る場合、型エラーが出た場合にどう修正するか的確な情報を示す必要があるんじゃないかなと思います。どうしたらいいか全然アイデアは無いのですが・・・。