But undef_method *does* actually add a new method: it adds a method
which prevents the superclass' method being called:

  class Foo < String; def +() end; undef_method :+ end
  Foo.new + "test" # => raises error

  class Bar < String; def +() end; remove_method :+ end
  Bar.new + "test" # => calls String#+

Seems consistant to me.