Index: test/test_java_extension.rb
===================================================================
--- test/test_java_extension.rb	(revision 3727)
+++ test/test_java_extension.rb	(working copy)
@@ -174,11 +174,17 @@
     }
   end
 
-  
   def test_java_interface_impl_with_block
     ran = false
-    executor = SimpleExecutor.new
-    executor.execute(Runnable.impl {ran = true})
+    SimpleExecutor.new.execute(Runnable.impl {ran = true})
     assert ran
   end
+
+  def test_ruby_object_duck_typed_as_java_interface
+    runnable = Object.new
+    def runnable.run; @ran ||= true; end
+    def runnable.ran; @ran; end
+    SimpleExecutor.new.execute(runnable)
+    assert runnable.ran
+  end
 end
Index: src/builtin/javasupport/proxy/interface.rb
===================================================================
--- src/builtin/javasupport/proxy/interface.rb	(revision 3727)
+++ src/builtin/javasupport/proxy/interface.rb	(working copy)
@@ -149,13 +149,22 @@
 
             def __jcreate!(*args)
               interfaces = self.class.send(:java_interfaces)
+              __jcreate_proxy!(interfaces, *args)
+            end
+
+            def __jcreate_meta!(*args)
+              interfaces = (class << self; self; end).send(:java_interfaces)
+              __jcreate_proxy!(interfaces, *args)
+            end
+
+            def __jcreate_proxy!(interfaces, *args)
               interfaces.freeze unless interfaces.frozen?
               self.java_object = Java.new_proxy_instance(*interfaces) do |proxy2, method, *args|
                 args.collect! { |arg| Java.java_to_ruby(arg) }
                 Java.ruby_to_java(self.__send__(method.name, *args))
               end
             end
-            private :__jcreate!
+            private :__jcreate!, :__jcreate_meta!, :__jcreate_proxy!
 
             include ::JavaProxyMethods
 
@@ -218,9 +227,11 @@
     super
   end #append_features
   
-  def extended(clazz)
-    puts "Hmmm, we really don't understand what you're going for here. But good luck with that."
-  end
+  def extended(obj)
+     metaclass = class << obj; self; end
+     interface_class = self
+     metaclass.instance_eval { include interface_class }
+   end
 
   # array creation/identity
   def [](*args)
Index: src/org/jruby/javasupport/JavaUtil.java
===================================================================
--- src/org/jruby/javasupport/JavaUtil.java	(revision 3727)
+++ src/org/jruby/javasupport/JavaUtil.java	(working copy)
@@ -41,8 +41,11 @@
 import org.jruby.RubyBignum;
 import org.jruby.RubyBoolean;
 import org.jruby.RubyFloat;
+import org.jruby.RubyModule;
 import org.jruby.RubyNumeric;
+import org.jruby.RubyObject;
 import org.jruby.RubyString;
+import org.jruby.runtime.Block;
 import org.jruby.runtime.MethodIndex;
 import org.jruby.runtime.ThreadContext;
 import org.jruby.runtime.builtin.IRubyObject;
@@ -291,6 +294,25 @@
                 return new Float(number.floatValue());
             }
         }
+        if (isDuckTypeConvertable(argument.getClass(), parameterType)) {
+            RubyObject rubyObject = (RubyObject) argument;
+            if (!rubyObject.respondsTo("java_object")) {
+                Ruby runtime = rubyObject.getRuntime();
+                IRubyObject javaUtilities = runtime.getModule("JavaUtilities");
+                IRubyObject javaInterfaceModule = Java.get_interface_module(javaUtilities, JavaClass.get(runtime, parameterType));
+                if (!rubyObject.isKindOf((RubyModule) javaInterfaceModule)) {
+                    rubyObject.extend(new IRubyObject[] {javaInterfaceModule});
+                }
+                JavaObject jo = (JavaObject) rubyObject.instance_eval(new IRubyObject[] {
+                    runtime.newString("send :__jcreate_meta!")}, Block.NULL_BLOCK);
+                return jo.getValue();
+            }
+        }
         return argument;
     }
+    
+    public static boolean isDuckTypeConvertable(Class providedArgumentType, Class parameterType) {
+        return parameterType.isInterface() && !parameterType.isAssignableFrom(providedArgumentType) 
+            && RubyObject.class.isAssignableFrom(providedArgumentType);
+    }
 }
Index: src/org/jruby/javasupport/Java.java
===================================================================
--- src/org/jruby/javasupport/Java.java	(revision 3727)
+++ src/org/jruby/javasupport/Java.java	(working copy)
@@ -645,7 +645,8 @@
             // Compatible (by inheritance)
             if(len == types.length) {
                 for(int j=0,m=len; j<m; j++) {
-                    if(!JavaClass.assignable(types[j],(Class)arg_types.get(j))) {
+                    if(!JavaClass.assignable(types[j],(Class)arg_types.get(j)) 
+                        && !JavaUtil.isDuckTypeConvertable((Class)arg_types.get(j), types[j])) {
                         continue mfor;
                     }
                 }

