diff --git a/proc.c b/proc.c
index 0398fb2..7f1e7a4 100644
--- a/proc.c
+++ b/proc.c
@@ -1229,12 +1229,12 @@ rb_mod_define_method(int argc, VALUE *argv, VALUE mod)
     if (rb_obj_is_method(body)) {
 	struct METHOD *method = (struct METHOD *)DATA_PTR(body);
 	VALUE rclass = method->rclass;
-	if (rclass != mod) {
+	if (rclass != mod && !RTEST(rb_class_inherited_p(mod, rclass))) {
 	    if (FL_TEST(rclass, FL_SINGLETON)) {
 		rb_raise(rb_eTypeError,
 			 "can't bind singleton method to a different class");
 	    }
-	    if (!RTEST(rb_class_inherited_p(mod, rclass))) {
+	    else {
 		rb_raise(rb_eTypeError,
 			 "bind argument must be a subclass of %s",
 			 rb_class2name(rclass));
@@ -1461,15 +1461,17 @@ umethod_bind(VALUE method, VALUE recv)
     struct METHOD *data, *bound;
 
     TypedData_Get_Struct(method, struct METHOD, &method_data_type, data);
-    if (data->rclass != CLASS_OF(recv)) {
-	if (FL_TEST(data->rclass, FL_SINGLETON)) {
-	    rb_raise(rb_eTypeError,
-		     "singleton method called for a different object");
-	}
-	if (!rb_obj_is_kind_of(recv, data->rclass)) {
-	    rb_raise(rb_eTypeError, "bind argument must be an instance of %s",
-		     rb_class2name(data->rclass));
-	}
+
+    if (data->rclass != CLASS_OF(recv) &&
+		!rb_obj_is_kind_of(recv, data->rclass)) {
+		if (FL_TEST(data->rclass, FL_SINGLETON)) {
+		    rb_raise(rb_eTypeError,
+			     "singleton method called for a different object");
+		}
+		else {
+		    rb_raise(rb_eTypeError, "bind argument must be an instance of %s",
+			     rb_class2name(data->rclass));
+		}
     }
 
     method = TypedData_Make_Struct(rb_cMethod, struct METHOD, &method_data_type, bound);
