diff --git a/modules/field/field.api.php b/modules/field/field.api.php
index f905fa0..d2d10e0 100644
--- a/modules/field/field.api.php
+++ b/modules/field/field.api.php
@@ -124,6 +124,10 @@ function hook_field_extra_fields_alter(&$info) {
 /**
  * Define Field API field types.
  *
+ * Note that fields and their instances should never be created in the same
+ * module that defines their field type, because disabling the module will mark
+ * the fields as inactive, preventing them from being removed on uninstall.
+ *
  * @return
  *   An array whose keys are field type names and whose values are arrays
  *   describing the field type, with the following key/value pairs:
diff --git a/modules/field/field.crud.inc b/modules/field/field.crud.inc
index 7361164..df7c0b5 100644
--- a/modules/field/field.crud.inc
+++ b/modules/field/field.crud.inc
@@ -23,6 +23,10 @@
  * This function does not bind the field to any bundle; use
  * field_create_instance() for that.
  *
+ * Note that fields and their instances should never be created in the same
+ * module that defines their field type, because disabling the module will mark
+ * the fields as inactive, preventing them from being removed on uninstall.
+ *
  * @param $field
  *   A field definition array. The field_name and type properties are required.
  *   Other properties, if omitted, will be given the following default values:
@@ -415,6 +419,10 @@ function field_delete_field($field_name) {
 /**
  * Creates an instance of a field, binding it to a bundle.
  *
+ * Note that fields and their instances should never be created in the same
+ * module that defines their field type, because disabling the module will mark
+ * the fields as inactive, preventing them from being removed on uninstall.
+ *
  * @param $instance
  *   A field instance definition array. The field_name, entity_type and
  *   bundle properties are required. Other properties, if omitted,
diff --git a/modules/field/field.module b/modules/field/field.module
index 163f448..8e93d79 100644
--- a/modules/field/field.module
+++ b/modules/field/field.module
@@ -415,6 +415,21 @@ function field_modules_disabled($modules) {
 }
 
 /**
+ * Implements hook_system_info_alter().
+ *
+ * Goes through a list of all modules that provide a field type, and makes them
+ * required if there are any active fields of that type.
+ */
+function field_system_info_alter(&$info, $file, $type) {
+  if ($type == 'module' && module_hook($file->name, 'field_info')) {
+    $fields = field_read_fields(array('module' => $file->name));
+    if (count($fields) > 0) {
+      $info['required'] = TRUE;
+    }
+  }
+}
+
+/**
  * Allows a module to update the database for fields and columns it controls.
  *
  * @param string $module
