diff --git a/modules/content_migrate/content_migrate.module b/modules/content_migrate/content_migrate.module
index 0b106b1..ee3c0c0 100644
--- a/modules/content_migrate/content_migrate.module
+++ b/modules/content_migrate/content_migrate.module
@@ -187,12 +187,6 @@ function content_migrate_new_columns($field) {
 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);
@@ -207,5 +201,39 @@ 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. Also save the
+    // partially converted legacy data from above.
+    $allowed_values = array(
+      0 => 0,
+      1 => 1,
+      // This will be removed after further processing.
+      'legacy_values' => $new_values,
+    );
+
+    // 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 0ad7bd0..2d772dc 100644
--- a/modules/content_migrate/modules/content_migrate.text.inc
+++ b/modules/content_migrate/modules/content_migrate.text.inc
@@ -145,4 +145,20 @@ function text_content_migrate_data_record_alter(&$record, $field, $instance) {
       }
       break;
   }
+
+  switch ($field['type']) {
+    case 'list_boolean':
+      // D6 only supported SQL storage, so it's ok to do this.
+      $field_name = $field['field_name'] . '_value';
+
+      // Replace the legacy value with the new values, which are always numeric.
+      // The legacy values are inserted via content_migrate_text_field_alter().
+      if (!empty($field['settings']['legacy_values']) && !empty($record[$field_name])) {
+        $legacy_keys = array_keys($field['settings']['legacy_values']);
+
+        // Casting this as an integer ensures the value is always either 0 or 1.
+        $record[$field_name] = (int) array_search($record[$field_name], $legacy_keys);
+      }
+      break;
+  }
 }
