表題のような言語がある。
詳細は以下から。
Duby
コード上は、

00: class Foo
01: def fib(n)
02: {n => java.lang.Integer::TYPE,
03: :return => java.lang.Integer::TYPE}
04: if (n < 2)
05: n
06: else
07: fib(n - 2) + fib(n - 1)
08: end
09: end
10: end

のように、ハッシュのような表記で、メソッドのはじめに、型情報を書き込む。
ただ、ほかの点でも完全にrubyの互換というわけではなくて、サブセット。
個人的には、rubyを使っていても、型チェックがほしいと思うときがある。

javaのような型の強い言語にくらべて、柔軟なプログラミングができるのが、rubyのいいところではある。
しかし、rubyやperlで書いているときにおきるバグやテストで見つかる不具合のかなりの部分が、Javaなどでは、コンパイル時の型チェックで検出されるような代物であることも確かだと思う。
rubyでも、時々、強い型チェック(いわゆるchicken typingでなくていいのだが)がほしいと思うときがある。それから、JavaやC++でよくやるオーバーロードみたいなことをしたいこともある。

Haskelみたいな型推論もいいし、common lispの総称関数もいいのだが、コード全体で型チェックするのではなくて、必要なところだけでも、型チェックを導入することはできないものだろうか?

そういう言語があるのかどうかは、知らないが、たとえば、
1、型情報を参照元(リファレンス)と、参照先の両方が持てるようにする。
2、構文としては、型情報を参照元に付与したブロック(Duby的コード)と付与しないブロック(Ruby的コード)の両方を認めるようにする。
3、Ruby的コードの中では、参照元の型情報はnilとなる。
4、Duby的コードの中では、参照元の型情報は、コード中で明示的に与えられており、参照先の型情報と一致していなくてはならない。一致しない場合は実行前にコンパイルエラーとなる。
5、Duby的コードからDuby的コードを呼び出すとき、および、Ruby的コードからRuby的コードを呼び出すときは、特に問題はない。それぞれ、普通の強い型の言語と弱い型の言語と同様に扱われる。
6、Duby的コードからRuby的コードが呼び出されるときにも、特に問題はない。参照元の型情報がなくなるだけ。
7、Ruby的コードからDuby的コードが呼び出されるときには、引数など、ブロックに与えられる変数は、キャスト用のメソッドが呼び出され、目的の型にキャストされる。キャスト用メソッドでエラーが出たときには、例外をraiseする。

問題があるのかな?
ひょっとしたら、7、の処理は、かなり重たいかもしれないけど。

今思いついた思いつきなので、まだ、どんな問題がありそうか、検証もしていないのだが。