Until someone switches a table name from lowercase to uppercase and the hand rolled optimizer stops working?
So, you changed code and didn't test it. Yup, definitely Oracle's fault.
Sometimes you just aren't going to pick up this sort of thing in testing as you'll only know about it under full production load. Their CBO is pretty powerful, but by and large it's often difficult to know why it makes certain decisions. And that's even when you use their full suite of profiling tools!
That's not even really a CBO issue. But I hear your pain :-)