diff --git modules/field/modules/list/list.module modules/field/modules/list/list.module
index bbf6bd9..f3b92cb 100644
--- modules/field/modules/list/list.module
+++ modules/field/modules/list/list.module
@@ -80,29 +80,35 @@ function list_field_settings_form($field, $instance, $has_data) {
   );
 
   if ($field['type'] == 'list_boolean') {
+    // For 'boolean' fields, replace the textarea with two separate texfields
+    // for 'on' and 'off' values. The 'allowed_values' input is kept hidden,
+    // and uses a value callback to assemble a 'list of allowed values' in the
+    // expected format from the separate 'on' and 'off' values.
     $values = list_extract_allowed_values($settings['allowed_values']);
     $off_value = array_shift($values);
     $on_value = array_shift($values);
     $form['allowed_values'] = array(
-      '#type' => 'markup',
+      '#type' => 'value',
       '#description' => '',
       '#input' => TRUE,
       '#value_callback' => 'list_boolean_allowed_values_callback',
       '#access' => empty($settings['allowed_values_function']),
     );
-    $form['allowed_values']['on'] = array(
+    $form['on'] = array(
       '#type' => 'textfield',
       '#title' => t('On value'),
       '#default_value' => $on_value,
       '#required' => FALSE,
       '#description' => t('If left empty, "1" will be used.'),
+      '#access' => empty($settings['allowed_values_function']),
     );
-    $form['allowed_values']['off'] = array(
+    $form['off'] = array(
       '#type' => 'textfield',
       '#title' => t('Off value'),
       '#default_value' => $off_value,
       '#required' => FALSE,
       '#description' => t('If left empty, "0" will be used.'),
+      '#access' => empty($settings['allowed_values_function']),
     );
   }
 
@@ -156,12 +162,14 @@ function list_allowed_values_setting_validate($element, &$form_state) {
 /**
 * Form element #value_callback: assembles the allowed values for 'boolean' fields.
 */
-function list_boolean_allowed_values_callback($element, $edit = FALSE) {
+function list_boolean_allowed_values_callback($element, $edit, $form_state) {
   if ($edit !== FALSE) {
-    $on = $edit['on'];
-    $off = $edit['off'];
-    $edit = "0|$off\n1|$on";
-    return $edit;
+    // The 'on' and 'off' values lie in the element's siblings, i.e in the
+    // values of the parent.
+    $values = drupal_array_get_nested_value($form_state['input'], $element['#parents']);
+    $on = $values['on'];
+    $off = $values['off'];
+    return "0|$off\n1|$on";
   }
 }
 
diff --git modules/field/modules/list/tests/list.test modules/field/modules/list/tests/list.test
index 13d2005..e560e4e 100644
--- modules/field/modules/list/tests/list.test
+++ modules/field/modules/list/tests/list.test
@@ -134,26 +134,40 @@ class ListFieldUITestCase extends FieldTestCase {
   function testAllowedValues() {
     $element_name = "field[settings][allowed_values]";
 
-    //Test 'List' field type.
+    // Test 'List' field type.
     $admin_path = $this->createListFieldAndEdit('list');
-    //Check that non-integer keys are rejected.
+    // Check that non-integer keys are rejected.
     $edit = array($element_name => "1.1|one\n");
     $this->drupalPost($admin_path, $edit, t('Save settings'));
     $this->assertText("keys must be integers", t('Form validation failed.'));
 
     // Test 'List (number)' field type.
     $admin_path = $this->createListFieldAndEdit('list_number');
-    //Check that non-numeric keys are rejected.
+    // Check that non-numeric keys are rejected.
     $edit = array($element_name => "1|one\nB|two");
     $this->drupalPost($admin_path, $edit, t('Save settings'));
     $this->assertText("each key must be a valid integer or decimal", t('Form validation failed.'));
 
-    //Test 'List (text)' field type.
+    // Test 'List (text)' field type.
     $admin_path = $this->createListFieldAndEdit('list_text');
-    //Check that over long keys are rejected.
+    // Check that over long keys are rejected.
     $edit = array($element_name => "1|one\n" . $this->randomName(256) . "|two");
     $this->drupalPost($admin_path, $edit, t('Save settings'));
     $this->assertText("each key must be a string at most 255 characters long", t('Form validation failed.'));
+
+    // Test 'Boolean' field type.
+    $admin_path = $this->createListFieldAndEdit('list_boolean');
+    // Check that the seperate 'On' and 'Off' form fields work.
+    $edit = array(
+      'field[settings][on]' => $this->randomName(),
+      'field[settings][off]' => $this->randomName(),
+    );
+    $this->drupalPost($admin_path, $edit, t('Save settings'));
+    $this->assertText("Saved test_list_boolean configuration.", t("The 'On' and 'Off' form fields work for boolean fields."));
+    // Test the allowed_values on the field settings form.
+    $this->drupalGet($admin_path);
+    $this->assertFieldByName('field[settings][on]', $edit['field[settings][on]'], t("The 'On' value is stored correctly."));
+    $this->assertFieldByName('field[settings][off]', $edit['field[settings][off]'], t("The 'Off' value is stored correctly."));
   }
 
   /**
