== と === と eql? の使い分けってどうなってるの?

今日、Array#- では eql? で比較行っているって言うのを知って
へぇっていう感じだったんだけど、Rubyistの人たちはきっちり使い分けできているのかな。

おれの感覚だと、=== は case 文で、== は普通の比較で、eql? はそんなのあったんだ位にしか
思っていなかったんだけど、実際これらはどう言う意図で作られた演算なの?