diff --git a/spec/ruby/core/exception/arguments_spec.rb b/spec/ruby/core/exception/arguments_spec.rb
index 47c4339e2d..b15f5a1d79 100644
--- a/spec/ruby/core/exception/arguments_spec.rb
+++ b/spec/ruby/core/exception/arguments_spec.rb
@@ -1,6 +1,11 @@
 require File.expand_path('../../../spec_helper', __FILE__)
 
 describe "ArgumentError" do
+  class ArgumentErrorDummyClass
+    def foo(a,b,c:)
+    end
+  end
+
   it "is a subclass of StandardError" do
     StandardError.should be_ancestor_of(ArgumentError)
   end
@@ -8,4 +13,16 @@
   it "gives its own class name as message if it has no message" do
     ArgumentError.new.message.should == "ArgumentError"
   end
+
+  it "includes receiver and method name when raised by application code" do
+    exc = begin
+      ArgumentErrorDummyClass.new.foo(3)
+    rescue => exc
+      exc
+    end
+
+    exc.instance_variable_get('@receiver').should_not be_nil
+    exc.instance_variable_get('@receiver').should.class === ArgumentErrorDummyClass
+    exc.instance_variable_get('@method_name').should == 'foo'
+  end
 end
diff --git a/vm_args.c b/vm_args.c
index 2499632f7a..119313db5d 100644
--- a/vm_args.c
+++ b/vm_args.c
@@ -9,7 +9,7 @@
 **********************************************************************/
 
 NORETURN(static void raise_argument_error(rb_execution_context_t *ec, const rb_iseq_t *iseq, const VALUE exc));
-NORETURN(static void argument_arity_error(rb_execution_context_t *ec, const rb_iseq_t *iseq, const int miss_argc, const int min_argc, const int max_argc));
+NORETURN(static void argument_arity_error(rb_execution_context_t *ec, const rb_iseq_t *iseq, struct rb_calling_info *calling, const int miss_argc, const int min_argc, const int max_argc));
 NORETURN(static void argument_kw_error(rb_execution_context_t *ec, const rb_iseq_t *iseq, const char *error, const VALUE keys));
 VALUE rb_keyword_error_new(const char *error, VALUE keys); /* class.c */
 static VALUE method_missing(VALUE obj, ID id, int argc, const VALUE *argv,
@@ -592,7 +592,7 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co
 		args_extend(args, min_argc);
 	    }
 	    else {
-		argument_arity_error(ec, iseq, given_argc, min_argc, max_argc);
+        argument_arity_error(ec, iseq, calling, given_argc, min_argc, max_argc);
 	    }
 	}
     }
@@ -614,8 +614,8 @@ setup_parameters_complex(rb_execution_context_t * const ec, const rb_iseq_t * co
 	    given_argc = max_argc;
 	}
 	else {
-	    argument_arity_error(ec, iseq, given_argc, min_argc, max_argc);
-	}
+    argument_arity_error(ec, iseq, calling, given_argc, min_argc, max_argc);
+  }
     }
 
     if (iseq->body->param.flags.has_lead) {
@@ -713,7 +713,9 @@ raise_argument_error(rb_execution_context_t *ec, const rb_iseq_t *iseq, const VA
 }
 
 static void
-argument_arity_error(rb_execution_context_t *ec, const rb_iseq_t *iseq, const int miss_argc, const int min_argc, const int max_argc)
+argument_arity_error(rb_execution_context_t *ec, const rb_iseq_t *iseq,
+                       struct rb_calling_info *calling,
+                       const int miss_argc, const int min_argc, const int max_argc)
 {
     VALUE exc = rb_arity_error_new(miss_argc, min_argc, max_argc);
     if (iseq->body->param.flags.has_kw) {
@@ -734,6 +736,9 @@ argument_arity_error(rb_execution_context_t *ec, const rb_iseq_t *iseq, const in
 	    RSTRING_PTR(mesg)[RSTRING_LEN(mesg)-1] = ')';
 	}
     }
+
+    rb_iv_set(exc, "@receiver", calling->recv);
+    rb_iv_set(exc, "@method_name", rb_iseq_method_name(iseq));
     raise_argument_error(ec, iseq, exc);
 }
 
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index f48cae45ae..179867c4b5 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1608,7 +1608,7 @@ vm_callee_setup_arg(rb_execution_context_t *ec, struct rb_calling_info *calling,
 	CALLER_SETUP_ARG(cfp, calling, ci); /* splat arg */
 
 	if (calling->argc != iseq->body->param.lead_num) {
-	    argument_arity_error(ec, iseq, calling->argc, iseq->body->param.lead_num, iseq->body->param.lead_num);
+    argument_arity_error(ec, iseq, calling, calling->argc, iseq->body->param.lead_num, iseq->body->param.lead_num);
 	}
 
 	CI_SET_FASTPATH(cc, vm_call_iseq_setup_func(ci, param_size, local_size),
@@ -2593,7 +2593,7 @@ vm_callee_setup_block_arg(rb_execution_context_t *ec, struct rb_calling_info *ca
 		}
 	    }
 	    else {
-		argument_arity_error(ec, iseq, calling->argc, iseq->body->param.lead_num, iseq->body->param.lead_num);
+        argument_arity_error(ec, iseq, calling, calling->argc, iseq->body->param.lead_num, iseq->body->param.lead_num);
 	    }
 	}
 
