diff --git includes/module.inc includes/module.inc
index a65a432..22fb0a2 100644
--- includes/module.inc
+++ includes/module.inc
@@ -532,13 +532,13 @@ function module_disable($module_list, $disable_dependents = TRUE) {
   }
 
   if (!empty($invoke_modules)) {
+    // Invoke hook_modules_disabled() before clearing the caches, so hook
+    // implementations are still able to invoke module hooks.
+    module_invoke_all('modules_disabled', $invoke_modules);
     // Refresh the module list to exclude the disabled modules.
     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.
-    module_invoke_all('modules_disabled', $invoke_modules);
     // Update the registry to remove the newly-disabled module.
     registry_update();
     _system_update_bootstrap_status();
diff --git modules/simpletest/tests/system_test.module modules/simpletest/tests/system_test.module
index 76d2701..58eacd0 100644
--- modules/simpletest/tests/system_test.module
+++ modules/simpletest/tests/system_test.module
@@ -161,6 +161,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 it's still possible to invoke hooks for disabled modules.
+    if (module_hook('aggregator', 'menu') && module_invoke('aggregator', 'menu')) {
+      drupal_set_message('Hooks of disabled modules can be invoked.');
+    }
   }
 }
 
diff --git modules/system/system.test modules/system/system.test
index d32b3ae..7b404c6 100644
--- modules/system/system.test
+++ modules/system/system.test
@@ -137,6 +137,10 @@ class EnableDisableTestCase extends ModuleTestCase {
     $this->assertTableCount('aggregator', TRUE);
     $this->assertLogMessage('system', "%module module disabled.", array('%module' => 'aggregator'), WATCHDOG_INFO);
 
+    // Verify that module hooks can still be used in hook_modules_disabled()
+    // implementations.
+    $this->assertText('Hooks of disabled modules can be invoked.');
+
     // Uninstall the module.
     $edit = array();
     $edit['uninstall[aggregator]'] = 'aggregator';
