diff --git a/gdb/eval.c b/gdb/eval.c
index 808cc916bb4..b263dc998d6 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -640,7 +640,7 @@ evaluate_subexp_do_call (expression *exp, enum noside noside,
 	}
       else if (ftype->code () == TYPE_CODE_XMETHOD)
 	{
-	  type *return_type = result_type_of_xmethod (callee, argvec);
+	  type *return_type = callee->result_type_of_xmethod (argvec);
 
 	  if (return_type == NULL)
 	    error (_("Xmethod is missing return type."));
@@ -678,7 +678,7 @@ evaluate_subexp_do_call (expression *exp, enum noside noside,
       return call_internal_function (exp->gdbarch, exp->language_defn,
 				     callee, argvec.size (), argvec.data ());
     case TYPE_CODE_XMETHOD:
-      return call_xmethod (callee, argvec);
+      return callee->call_xmethod (argvec);
     default:
       return call_function_by_hand (callee, default_return_type, argvec);
     }
diff --git a/gdb/valarith.c b/gdb/valarith.c
index 328781ba784..117662fda95 100644
--- a/gdb/valarith.c
+++ b/gdb/valarith.c
@@ -513,13 +513,13 @@ value_x_binop (struct value *arg1, struct value *arg2, enum exp_opcode op,
 	  if (noside == EVAL_AVOID_SIDE_EFFECTS)
 	    {
 	      struct type *return_type
-		= result_type_of_xmethod (argvec[0], argvec.slice (1));
+		= argvec[0]->result_type_of_xmethod (argvec.slice (1));
 
 	      if (return_type == NULL)
 		error (_("Xmethod is missing return type."));
 	      return value::zero (return_type, VALUE_LVAL (arg1));
 	    }
-	  return call_xmethod (argvec[0], argvec.slice (1));
+	  return argvec[0]->call_xmethod (argvec.slice (1));
 	}
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
 	{
@@ -626,13 +626,13 @@ value_x_unop (struct value *arg1, enum exp_opcode op, enum noside noside)
 	  if (noside == EVAL_AVOID_SIDE_EFFECTS)
 	    {
 	      struct type *return_type
-		= result_type_of_xmethod (argvec[0], argvec[1]);
+		= argvec[0]->result_type_of_xmethod (argvec[1]);
 
 	      if (return_type == NULL)
 		error (_("Xmethod is missing return type."));
 	      return value::zero (return_type, VALUE_LVAL (arg1));
 	    }
-	  return call_xmethod (argvec[0], argvec[1]);
+	  return argvec[0]->call_xmethod (argvec[1]);
 	}
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
 	{
diff --git a/gdb/valops.c b/gdb/valops.c
index 137134abe6c..89bd5c95a2c 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -3028,7 +3028,7 @@ find_overload_match (gdb::array_view<value *> args,
 				    method_oload_champ, basetype, boffset);
 	}
       else
-	*valp = value_from_xmethod
+	*valp = value::from_xmethod
 	  (std::move (xmethods[ext_method_oload_champ]));
     }
   else
diff --git a/gdb/value.c b/gdb/value.c
index b36c77694f6..cccb02411c6 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -2355,7 +2355,7 @@ show_convenience (const char *ignore, int from_tty)
 /* See value.h.  */
 
 struct value *
-value_from_xmethod (xmethod_worker_up &&worker)
+value::from_xmethod (xmethod_worker_up &&worker)
 {
   struct value *v;
 
@@ -2367,26 +2367,26 @@ value_from_xmethod (xmethod_worker_up &&worker)
   return v;
 }
 
-/* Return the type of the result of TYPE_CODE_XMETHOD value METHOD.  */
+/* See value.h.  */
 
 struct type *
-result_type_of_xmethod (struct value *method, gdb::array_view<value *> argv)
+value::result_type_of_xmethod (gdb::array_view<value *> argv)
 {
-  gdb_assert (method->type ()->code () == TYPE_CODE_XMETHOD
-	      && method->m_lval == lval_xcallable && !argv.empty ());
+  gdb_assert (type ()->code () == TYPE_CODE_XMETHOD
+	      && m_lval == lval_xcallable && !argv.empty ());
 
-  return method->m_location.xm_worker->get_result_type (argv[0], argv.slice (1));
+  return m_location.xm_worker->get_result_type (argv[0], argv.slice (1));
 }
 
-/* Call the xmethod corresponding to the TYPE_CODE_XMETHOD value METHOD.  */
+/* See value.h.  */
 
 struct value *
-call_xmethod (struct value *method, gdb::array_view<value *> argv)
+value::call_xmethod (gdb::array_view<value *> argv)
 {
-  gdb_assert (method->type ()->code () == TYPE_CODE_XMETHOD
-	      && method->m_lval == lval_xcallable && !argv.empty ());
+  gdb_assert (type ()->code () == TYPE_CODE_XMETHOD
+	      && m_lval == lval_xcallable && !argv.empty ());
 
-  return method->m_location.xm_worker->invoke (argv[0], argv.slice (1));
+  return m_location.xm_worker->invoke (argv[0], argv.slice (1));
 }
 
 /* Extract a value as a C number (either long or double).
diff --git a/gdb/value.h b/gdb/value.h
index 8f4636ed6b4..573b5e14319 100644
--- a/gdb/value.h
+++ b/gdb/value.h
@@ -542,6 +542,17 @@ struct value
      WHOLE --- regardless of what kind of lvalue WHOLE is.  */
   void set_component_location (const struct value *whole);
 
+  /* Build a value wrapping and representing WORKER.  The value takes
+     ownership of the xmethod_worker object.  */
+  static struct value *from_xmethod (xmethod_worker_up &&worker);
+
+  /* Return the type of the result of TYPE_CODE_XMETHOD value METHOD.  */
+  struct type *result_type_of_xmethod (gdb::array_view<value *> argv);
+
+  /* Call the xmethod corresponding to the TYPE_CODE_XMETHOD value
+     METHOD.  */
+  struct value *call_xmethod (gdb::array_view<value *> argv);
+
 
   /* Type of value; either not an lval, or one of the various
      different possible kinds of lval.  */
@@ -1478,17 +1489,6 @@ struct value *call_internal_function (struct gdbarch *gdbarch,
 
 const char *value_internal_function_name (struct value *);
 
-/* Build a value wrapping and representing WORKER.  The value takes ownership
-   of the xmethod_worker object.  */
-
-extern struct value *value_from_xmethod (xmethod_worker_up &&worker);
-
-extern struct type *result_type_of_xmethod (struct value *method,
-					    gdb::array_view<value *> argv);
-
-extern struct value *call_xmethod (struct value *method,
-				   gdb::array_view<value *> argv);
-
 /* Destroy the values currently allocated.  This is called when GDB is
    exiting (e.g., on quit_force).  */
 extern void finalize_values ();
