diff --git includes/common.inc includes/common.inc
index 382d047..2383dfc 100644
--- includes/common.inc
+++ includes/common.inc
@@ -5751,7 +5751,13 @@ function drupal_array_get_nested_value(array &$array, array $parents, &$key_exis
     // array_key_exists() is slower than isset() and triggers notices if the
     // second argument is not an array, so only call it when absolutely
     // necessary.
-    if (isset($ref[$parent]) || (is_array($ref) && array_key_exists($parent, $ref))) {
+    if ((isset($ref[$parent])) || (is_array($ref) && array_key_exists($parent, $ref))) {
+      if (!is_array($ref)) {
+        // $ref is a string. This means that it is not possible to add child
+        // elements to it. Tell that caller that it already exists.
+        $key_exists = TRUE;
+        return NULL;
+      }
       $ref = &$ref[$parent];
     }
     else {
diff --git modules/field/modules/list/list.module modules/field/modules/list/list.module
index 618583e..27f2d65 100644
--- modules/field/modules/list/list.module
+++ modules/field/modules/list/list.module
@@ -88,6 +88,7 @@ function list_field_settings_form($field, $instance, $has_data) {
       '#description' => '',
       '#input' => TRUE,
       '#value_callback' => 'list_boolean_allowed_values_callback',
+      '#process' => array('list_boolean_disable_onoff_elements'),
       '#access' => empty($settings['allowed_values_function']),
     );
     $form['allowed_values']['on'] = array(
@@ -166,6 +167,20 @@ function list_boolean_allowed_values_callback($element, $edit = FALSE) {
 }
 
 /**
+ * Form element #process callback: disable on/off during input processing.
+ *
+ * This must be done conditionally because doing it always disables the default
+ * value handling and the current value doesn't show up.
+ */
+function list_boolean_disable_onoff_elements($element, $form_state) {
+  if (!empty($form_state['process_input'])) {
+    $element['on']['#input'] = FALSE;
+    $element['off']['#input'] = FALSE;
+  }
+  return $element;
+}
+
+/**
  * Implements hook_field_update_field().
  */
 function list_field_update_field($field, $prior_field, $has_data) {
