diff --git a/modules/content_migrate/content_migrate.module b/modules/content_migrate/content_migrate.module
index f088150..5bcd042 100644
--- a/modules/content_migrate/content_migrate.module
+++ b/modules/content_migrate/content_migrate.module
@@ -244,12 +244,6 @@ function content_migrate_content_migrate_data_record_alter(&$record, $field, $in
 function content_migrate_extract_allowed_values($legacy_values, $field_type) {
   $allowed_values = array();
 
-  if ($field_type == 'list_boolean') {
-    // Initialize these so the order is proper, even if both keys aren't
-    // defined in the legacy string.
-    $allowed_values = array(0 => 0, 1 => 1);
-  }
-
   if (!empty($legacy_values)) {
     foreach (explode("\n", $legacy_values) as $value) {
       $value = trim($value);
@@ -264,5 +258,36 @@ function content_migrate_extract_allowed_values($legacy_values, $field_type) {
     }
   }
 
+  // Fix boolean fields. In D6 the boolean selector used the first value as the
+  // 'no' option, the second as the 'yes' option; if there was only one value
+  // the field did not work correctly and it was not possible to save a 'yes'
+  // value. As a result, it is safe to always use the first value as 'no' and
+  // the second value as 'yes'.
+  if ($field_type == 'list_boolean') {
+    // Work with a copy of the fields.
+    $new_values = $allowed_values;
+
+    // D7 requires boolean fields to have the keys 0 and 1.
+    $allowed_values = array(
+      0 => 0,
+      1 => 1,
+    );
+
+    // Get the keys of the converted data.
+    $keys = array_keys($new_values);
+
+    // Replace the 'no' value. If no value was found, it will default to '0'.
+    if (!empty($keys)) {
+      $key = array_shift($keys);
+      $allowed_values[0] = $new_values[$key];
+    }
+
+    // Replace the 'yes' value. If no value was found, it will default to '1'.
+    if (!empty($keys)) {
+      $key = array_shift($keys);
+      $allowed_values[1] = $new_values[$key];
+    }
+  }
+
   return $allowed_values;
 }
diff --git a/modules/content_migrate/modules/content_migrate.text.inc b/modules/content_migrate/modules/content_migrate.text.inc
index 00c5b82..ef44539 100644
--- a/modules/content_migrate/modules/content_migrate.text.inc
+++ b/modules/content_migrate/modules/content_migrate.text.inc
@@ -78,10 +78,14 @@ function content_migrate_text_field_alter(&$field_value, $instance_value) {
         case 'list_text':
         case 'list_boolean':
           $allowed_values = array();
+          $legacy_values = array();
           if (!empty($field_value['settings']['allowed_values'])) {
             $allowed_values = content_migrate_extract_allowed_values($field_value['settings']['allowed_values'], $field_value['type']);
+            // Keep a copy of the legacy values.
+            $legacy_values = $field_value['settings']['allowed_values'];
           }
           $field_value['settings']['allowed_values'] = $allowed_values;
+          $field_value['settings']['legacy_values'] = $legacy_values;
           break;
 
       }
@@ -137,5 +141,17 @@ function content_migrate_text_data_record_alter(&$record, $field, $instance) {
           $record[$field['field_name'] . '_format'] = variable_get('filter_default_format', 1);
         }
       }
+      break;
+  }
+
+  switch ($field['type']) {
+    case 'list_boolean':
+      // Replace the legacy value with the new values, which are always numeric.
+      // The legacy values are inserted via content_migrate_text_field_alter().
+      $legacy_keys = array_keys($field['settings']['legacy_values']);
+
+      // Casting this as an integer ensures the value is always either 0 or 1.
+      $record[$field['field_name']] = (int) array_search($record[$field['field_name']], $legacy_keys);
+      break;
   }
-}
\ No newline at end of file
+}
