diff --git includes/module.inc includes/module.inc
index aa061e1..0100591 100644
--- includes/module.inc
+++ includes/module.inc
@@ -537,8 +537,8 @@ function module_disable($module_list, $disable_dependents = TRUE) {
     system_list_reset();
     module_list(TRUE);
     module_implements('', FALSE, TRUE);
-    // Invoke hook_modules_disabled before disabling modules,
-    // so we can still call module hooks to get information.
+    // Invoke hook_modules_disabled() after clearing the caches, so that for the
+    // hook implementations the modules are already disabled.
     module_invoke_all('modules_disabled', $invoke_modules);
     // Update the registry to remove the newly-disabled module.
     registry_update();
diff --git modules/simpletest/tests/system_test.module modules/simpletest/tests/system_test.module
index 4d7042e..a332111 100644
--- modules/simpletest/tests/system_test.module
+++ modules/simpletest/tests/system_test.module
@@ -167,6 +167,10 @@ function system_test_modules_enabled($modules) {
 function system_test_modules_disabled($modules) {
   if (in_array('aggregator', $modules)) {
     drupal_set_message(t('hook_modules_disabled fired for aggregator'));
+    // Test whether the module is already disabled as the hook describes.
+    if (!module_exists('aggregator')) {
+      drupal_set_message('Modules passed to hook_modules_disabled are already disabled.');
+    }
   }
 }
 
diff --git modules/system/system.test modules/system/system.test
index 549df44..6059f2a 100644
--- modules/system/system.test
+++ modules/system/system.test
@@ -137,6 +137,9 @@ class EnableDisableTestCase extends ModuleTestCase {
     $this->assertTableCount('aggregator', TRUE);
     $this->assertLogMessage('system', "%module module disabled.", array('%module' => 'aggregator'), WATCHDOG_INFO);
 
+    // Verify that the modules passed to hook_modules_disabled are disabled.
+    $this->assertText('Modules passed to hook_modules_disabled are already disabled.');
+
     // Uninstall the module.
     $edit = array();
     $edit['uninstall[aggregator]'] = 'aggregator';
