diff --git a/core/includes/form.inc b/core/includes/form.inc
index 87ae891..a1afd2e 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -1635,8 +1635,7 @@ function form_error(&$element, $message = '') {
  * modules to customize what happens. For example, during this function's life
  * cycle, the following functions get called for each element:
  * - $element['#value_callback']: A function that implements how user input is
- *   mapped to an element's #value property. This defaults to a function named
- *   'form_type_TYPE_value' where TYPE is $element['#type'].
+ *   mapped to an element's #value property.
  * - $element['#process']: An array of functions called after user input has
  *   been mapped to the element's #value property. These functions can be used
  *   to dynamically add child elements: for example, for the 'date' element
@@ -1954,7 +1953,10 @@ function _form_builder_handle_input_element($form_id, &$element, &$form_state) {
 
   // Set the element's #value property.
   if (!isset($element['#value']) && !array_key_exists('#value', $element)) {
-    $value_callback = !empty($element['#value_callback']) ? $element['#value_callback'] : 'form_type_' . $element['#type'] . '_value';
+    // If a #value_callback is defined for this element, it is an essential
+    // requirement for handling user input, so it has to exist and must not be
+    // conditionally invoked.
+    $value_callback = !empty($element['#value_callback']) ? $element['#value_callback'] : FALSE;
     if ($process_input) {
       // Get the input for the current element. NULL values in the input need to
       // be explicitly distinguished from missing input. (see below)
@@ -1978,7 +1980,7 @@ function _form_builder_handle_input_element($form_id, &$element, &$form_state) {
       // If we have input for the current element, assign it to the #value
       // property, optionally filtered through $value_callback.
       if ($input_exists) {
-        if (function_exists($value_callback)) {
+        if ($value_callback) {
           $element['#value'] = $value_callback($element, $input, $form_state);
         }
         if (!isset($element['#value']) && isset($input)) {
@@ -1993,7 +1995,7 @@ function _form_builder_handle_input_element($form_id, &$element, &$form_state) {
     // Load defaults.
     if (!isset($element['#value'])) {
       // Call #type_value without a second argument to request default_value handling.
-      if (function_exists($value_callback)) {
+      if ($value_callback) {
         $element['#value'] = $value_callback($element, FALSE, $form_state);
       }
       // Final catch. If we haven't set a value yet, use the explicit default value.
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 625be0a..d0c8a3f 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -350,6 +350,7 @@ function system_element_info() {
   );
   $types['image_button'] = array(
     '#input' => TRUE,
+    '#value_callback' => 'form_type_image_button_value',
     '#button_type' => 'submit',
     '#executes_submit_callback' => TRUE,
     '#limit_validation_errors' => FALSE,
@@ -361,6 +362,7 @@ function system_element_info() {
   );
   $types['textfield'] = array(
     '#input' => TRUE,
+    '#value_callback' => 'form_type_textfield_value',
     '#size' => 60,
     '#maxlength' => 128,
     '#autocomplete_path' => FALSE,
@@ -390,6 +392,7 @@ function system_element_info() {
   );
   $types['password_confirm'] = array(
     '#input' => TRUE,
+    '#value_callback' => 'form_type_password_confirm_value',
     '#process' => array('form_process_password_confirm', 'user_form_process_password_confirm'),
     '#theme_wrappers' => array('form_element'),
   );
@@ -418,12 +421,14 @@ function system_element_info() {
   );
   $types['checkboxes'] = array(
     '#input' => TRUE,
+    '#value_callback' => 'form_type_checkboxes_value',
     '#process' => array('form_process_checkboxes'),
     '#theme_wrappers' => array('checkboxes'),
     '#pre_render' => array('form_pre_render_conditional_form_element'),
   );
   $types['checkbox'] = array(
     '#input' => TRUE,
+    '#value_callback' => 'form_type_checkbox_value',
     '#return_value' => 1,
     '#theme' => 'checkbox',
     '#process' => array('form_process_checkbox', 'ajax_process_form'),
@@ -432,6 +437,7 @@ function system_element_info() {
   );
   $types['select'] = array(
     '#input' => TRUE,
+    '#value_callback' => 'form_type_select_value',
     '#multiple' => FALSE,
     '#process' => array('form_process_select', 'ajax_process_form'),
     '#theme' => 'select',
@@ -458,6 +464,7 @@ function system_element_info() {
   );
   $types['tableselect'] = array(
     '#input' => TRUE,
+    '#value_callback' => 'form_type_tableselect_value',
     '#js_select' => TRUE,
     '#multiple' => TRUE,
     '#process' => array('form_process_tableselect'),
@@ -513,6 +520,7 @@ function system_element_info() {
 
   $types['token'] = array(
     '#input' => TRUE,
+    '#value_callback' => 'form_type_token_value',
     '#theme' => 'hidden',
   );
 
