diff --git a/src/org/jruby/anno/AnnotationBinder.java b/src/org/jruby/anno/AnnotationBinder.java
index bbe0232..1b60084 100644
--- a/src/org/jruby/anno/AnnotationBinder.java
+++ b/src/org/jruby/anno/AnnotationBinder.java
@@ -232,8 +232,9 @@ public class AnnotationBinder implements AnnotationProcessorFactory {
                                                                                             actualRequired,
                                                                                             anno.optional(),
                                                                                             false);
+                    String implClass = anno.meta() ? "cls.getSingletonClass()" : "cls";
                     
-                    out.println("        javaMethod = new " + annotatedBindingName + "(cls, Visibility." + anno.visibility() + ");");
+                    out.println("        javaMethod = new " + annotatedBindingName + "(" + implClass + ", Visibility." + anno.visibility() + ");");
                     out.println("        javaMethod.setArity(Arity.createArity(" + getArityValue(anno, actualRequired) + "));");
                     out.println("        javaMethod.setJavaName(\"" + md.getSimpleName() + "\");");
                     out.println("        javaMethod.setSingleton(" + isStatic + ");");
@@ -391,7 +392,7 @@ public class AnnotationBinder implements AnnotationProcessorFactory {
 
                     if (jrubyMethod.module()) {
                         // module/singleton methods are all defined public
-                        out.println("        moduleMethod = javaMethod.dup();");
+                        out.println("        moduleMethod = javaMethod.dupForClass(cls.getSingletonClass());");
                         out.println("        moduleMethod.setVisibility(Visibility.PUBLIC);");
 
                         //                        RubyModule singletonClass = module.getSingletonClass();
diff --git a/src/org/jruby/internal/runtime/methods/JavaMethod.java b/src/org/jruby/internal/runtime/methods/JavaMethod.java
index a17a80f..5118d50 100644
--- a/src/org/jruby/internal/runtime/methods/JavaMethod.java
+++ b/src/org/jruby/internal/runtime/methods/JavaMethod.java
@@ -423,6 +423,14 @@ public abstract class JavaMethod extends DynamicMethod implements JumpTarget, Cl
         }
     }
     
+    public DynamicMethod dupForClass(RubyModule newImplementationClass) {
+        DynamicMethod copy = dup();
+        if (copy != null) {
+            copy.implementationClass = newImplementationClass;
+        }
+        return copy;
+    }
+    
     protected void pre(ThreadContext context, IRubyObject self, String name, Block block) {
         callConfig.pre(context, self, getImplementationClass(), name, block, staticScope, this);
     }
