diff --git a/core/includes/form.inc b/core/includes/form.inc
index 5d6b32e50435918acd62b5038a8411fa8df5bb55..d74dcf7d58027ae214cd51e99203930d5e690f90 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -1422,8 +1422,8 @@ function _form_validate(&$elements, &$form_state, $form_id = NULL) {
     // Call any element-specific validators. These must act on the element
     // #value data.
     elseif (isset($elements['#element_validate'])) {
-      foreach ($elements['#element_validate'] as $function) {
-        $function($elements, $form_state, $form_state['complete_form']);
+      foreach ($elements['#element_validate'] as $callback) {
+        call_user_func_array($callback, array(&$elements, &$form_state, &$form_state['complete_form']));
       }
     }
 
diff --git a/core/modules/system/tests/modules/form_test/form_test.module b/core/modules/system/tests/modules/form_test/form_test.module
index 6ea5aa31f442a35057cd4006c885cd4d669cb753..03b7cb82f97721c17284ead4198dbdc0a6e9aa91 100644
--- a/core/modules/system/tests/modules/form_test/form_test.module
+++ b/core/modules/system/tests/modules/form_test/form_test.module
@@ -5,6 +5,8 @@
  * Helper module for the form API tests.
  */
 
+use Drupal\form_test\Callbacks;
+
 /**
  * Implements hook_menu().
  */
@@ -385,11 +387,13 @@ function system_form_form_test_alter_form_alter(&$form, &$form_state) {
  *   should be contained in the rebuilt form.
  */
 function form_test_validate_form($form, &$form_state) {
+  $object = new Callbacks();
+
   $form['name'] = array(
     '#type' => 'textfield',
     '#title' => 'Name',
     '#default_value' => '',
-    '#element_validate' => array('form_test_element_validate_name'),
+    '#element_validate' => array(array($object, 'validateName')),
   );
   $form['submit'] = array(
     '#type' => 'submit',
@@ -403,42 +407,6 @@ function form_test_validate_form($form, &$form_state) {
   return $form;
 }
 
-/**
- * Form element validation handler for 'name' in form_test_validate_form().
- */
-function form_test_element_validate_name(&$element, &$form_state) {
-  $triggered = FALSE;
-  if ($form_state['values']['name'] == 'element_validate') {
-    // Alter the form element.
-    $element['#value'] = '#value changed by #element_validate';
-    // Alter the submitted value in $form_state.
-    form_set_value($element, 'value changed by form_set_value() in #element_validate', $form_state);
-
-    $triggered = TRUE;
-  }
-  if ($form_state['values']['name'] == 'element_validate_access') {
-    $form_state['storage']['form_test_name'] = $form_state['values']['name'];
-    // Alter the form element.
-    $element['#access'] = FALSE;
-
-    $triggered = TRUE;
-  }
-  elseif (!empty($form_state['storage']['form_test_name'])) {
-    // To simplify this test, just take over the element's value into $form_state.
-    form_set_value($element, $form_state['storage']['form_test_name'], $form_state);
-
-    $triggered = TRUE;
-  }
-
-  if ($triggered) {
-    // Output the element's value from $form_state.
-    drupal_set_message(t('@label value: @value', array('@label' => $element['#title'], '@value' => $form_state['values']['name'])));
-
-    // Trigger a form validation error to see our changes.
-    form_set_error('');
-  }
-}
-
 /**
  * Form validation handler for form_test_validate_form().
  */
diff --git a/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/Callbacks.php b/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/Callbacks.php
new file mode 100644
index 0000000000000000000000000000000000000000..6699cd7da37154711c3b66bfc0d6430a48bb26e1
--- /dev/null
+++ b/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/Callbacks.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\form_test\Callbacks.
+ */
+
+namespace Drupal\form_test;
+
+/**
+ * Simple class for testing methods as element validation callbacks.
+ */
+class Callbacks {
+
+  /**
+   * Form element validation handler for 'name' in form_test_validate_form().
+   */
+  public function validateName(&$element, &$form_state) {
+    $triggered = FALSE;
+    if ($form_state['values']['name'] == 'element_validate') {
+      // Alter the form element.
+      $element['#value'] = '#value changed by #element_validate';
+      // Alter the submitted value in $form_state.
+      form_set_value($element, 'value changed by form_set_value() in #element_validate', $form_state);
+
+      $triggered = TRUE;
+    }
+    if ($form_state['values']['name'] == 'element_validate_access') {
+      $form_state['storage']['form_test_name'] = $form_state['values']['name'];
+      // Alter the form element.
+      $element['#access'] = FALSE;
+
+      $triggered = TRUE;
+    }
+    elseif (!empty($form_state['storage']['form_test_name'])) {
+      // To simplify this test, just take over the element's value into $form_state.
+      form_set_value($element, $form_state['storage']['form_test_name'], $form_state);
+
+      $triggered = TRUE;
+    }
+
+    if ($triggered) {
+      // Output the element's value from $form_state.
+      drupal_set_message(t('@label value: @value', array('@label' => $element['#title'], '@value' => $form_state['values']['name'])));
+
+      // Trigger a form validation error to see our changes.
+      form_set_error('');
+    }
+  }
+}