diff --git modules/field/field.api.php modules/field/field.api.php
index a033cba..ce96a32 100644
--- modules/field/field.api.php
+++ modules/field/field.api.php
@@ -764,10 +764,11 @@ function hook_field_widget_info_alter(&$info) {
  * from the official definitions returned by field_info_field() and
  * field_info_instance(). If the widget uses Form API callbacks (like
  * #element_validate, #value_callback...) that need to access the $field or
- * $instance definitions, they should not use the field_info_*() functions, but
- * fetch the information present in $form_state['field']:
- * - $form_state['field'][$field_name][$langcode]['field']
- * - $form_state['field'][$field_name][$langcode]['instance']
+ * $instance definitions, they should not use the field_info_*() functions,
+ * but use field_form_info(). Alternatively, the specific properties from
+ * $field and $instance needed by element callbacks can be set as ad-hoc
+ * #custom properties on the $element.
+ * @see field_form_info()
  *
  * @param $form
  *   The entire form array.
diff --git modules/field/field.form.inc modules/field/field.form.inc
index 49c6344..0c5548f 100644
--- modules/field/field.form.inc
+++ modules/field/field.form.inc
@@ -411,3 +411,30 @@ function field_add_more_js($form, $form_state) {
 
   return $element;
 }
+
+/**
+ * Provides field and instance definitions for a widget's helper callbacks.
+ *
+ * This function should be used by widgets helper element callbacks (such as
+ * #element_validate, #value_callback, #pre_render...) when they need to
+ * access field or instance properties.
+ *
+ * Those helper callbacks cannot use field_info_field() / field_info_instance()
+ * because, depending on the context in which the widget is being included
+ * (regular entity edit form, 'default value' input in the field settings form,
+ * etc.), the $field and $instance arrays might differ from the official
+ * definitions returned by field_info_*().
+ *
+ * @param $element
+ *   The structured array for the widget.
+ * @param $form_state
+ *   The form state.
+ * @return
+ *   A numerically indexed array with the following values:
+ *   - 0: The field definition array.
+ *   - 1: The instance definition array.
+ */
+function field_form_info($element, $form_state) {
+  $info = $form_state['field'][$element['#field_name']][$element['#language']];
+  return array($info['field'], $info['instance']);
+}
diff --git modules/field/modules/number/number.module modules/field/modules/number/number.module
index 8ecba90..3334579 100644
--- modules/field/modules/number/number.module
+++ modules/field/modules/number/number.module
@@ -356,8 +356,7 @@ function number_field_widget_form(&$form, &$form_state, $field, $instance, $lang
  * FAPI validation of an individual number element.
  */
 function number_field_widget_validate($element, &$form_state) {
-  $field = $form_state['field'][$element['#field_name']][$element['#language']]['field'];
-  $instance = $form_state['field'][$element['#field_name']][$element['#language']]['instance'];
+  list($field, $instance) = field_form_info($element, $form_state);
 
   $type = $element['#number_type'];
   $value = $element['#value'];
diff --git modules/file/file.field.inc modules/file/file.field.inc
index 3f2350f..b49b954 100644
--- modules/file/file.field.inc
+++ modules/file/file.field.inc
@@ -583,7 +583,7 @@ function file_field_widget_value($element, $input = FALSE, $form_state) {
   if ($input) {
     // Checkboxes lose their value when empty.
     // If the display field is present make sure its unchecked value is saved.
-    $field = $form_state['field'][$element['#field_name']][$element['#language']]['field'];
+    list($field, $instance) = field_form_info($element, $form_state);
     if (empty($input['display'])) {
       $input['display'] = $field['settings']['display_field'] ? 0 : 1;
     }
@@ -611,8 +611,7 @@ function file_field_widget_process($element, &$form_state, $form) {
   $item = $element['#value'];
   $item['fid'] = $element['fid']['#value'];
 
-  $field = $form_state['field'][$element['#field_name']][$element['#language']]['field'];
-  $instance = $form_state['field'][$element['#field_name']][$element['#language']]['instance'];
+  list($field, $instance) = field_form_info($element, $form_state);
   $settings = $instance['widget']['settings'];
 
   $element['#theme'] = 'file_widget';
diff --git modules/image/image.field.inc modules/image/image.field.inc
index d73ee59..80441bd 100644
--- modules/image/image.field.inc
+++ modules/image/image.field.inc
@@ -335,7 +335,7 @@ function image_field_widget_process($element, &$form_state, $form) {
   $item = $element['#value'];
   $item['fid'] = $element['fid']['#value'];
 
-  $instance = $form_state['field'][$element['#field_name']][$element['#language']]['instance'];
+  list($field, $instance) = field_form_info($element, $form_state);
 
   $settings = $instance['settings'];
   $widget_settings = $instance['widget']['settings'];
diff --git modules/taxonomy/taxonomy.module modules/taxonomy/taxonomy.module
index b300354..a82640f 100644
--- modules/taxonomy/taxonomy.module
+++ modules/taxonomy/taxonomy.module
@@ -1457,7 +1457,7 @@ function taxonomy_autocomplete_validate($element, &$form_state) {
   $value = array();
   if ($tags = $element['#value']) {
     // Collect candidate vocabularies.
-    $field = $form_state['field'][$element['#field_name']][$element['#language']]['field'];
+    list($field, $instance) = field_form_info($element, $form_state);
     $vocabularies = array();
     foreach ($field['settings']['allowed_values'] as $tree) {
       if ($vocabulary = taxonomy_vocabulary_machine_name_load($tree['vocabulary'])) {
