It seems that starting with Ruby 2.1, define_method respects private:
$ rvm 2.1.0
$ ruby /tmp/test.rb
/tmp/test.rb:10:in `': private method `private_method' called for # (NoMethodError)
$ rvm 2.0
$ ruby /tmp/test.rb
uh!
(I realize this is an old question, but I happened across it via Google.)