diff --git a/modules/simpletest/tests/system_test.module b/modules/simpletest/tests/system_test.module
index 46fb876..c0e7ae2 100644
--- a/modules/simpletest/tests/system_test.module
+++ b/modules/simpletest/tests/system_test.module
@@ -203,6 +203,15 @@ function system_test_exit() {
 }
 
 /**
+ * Implements hook_registry_files_alter().
+ */
+function system_test_registry_files_alter(&$files, $modules) {
+  // Set a message so that a request to update.php can confirm the hook is
+  // invoked.
+  drupal_set_message('hook_registry_files_alter() invoked');
+}
+
+/**
  * Implements hook_system_info_alter().
  */
 function system_test_system_info_alter(&$info, $file, $type) {
diff --git a/modules/system/system.module b/modules/system/system.module
index 3ebc657..b25f2c7 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -2382,6 +2382,10 @@ function _system_rebuild_module_data() {
 
     // Invoke hook_system_info_alter() to give installed modules a chance to
     // modify the data in the .info files if necessary.
+    // system_rebuild_module_data() is often called before a full bootstrap,
+    // such as in the installer. So to allow hook_system_info_alter() to run
+    // successfully, ensure all modules are loaded before invoking the hook.
+    module_load_all();
     $type = 'module';
     drupal_alter('system_info', $modules[$key]->info, $modules[$key], $type);
   }
diff --git a/modules/system/system.test b/modules/system/system.test
index 3ce5177..a33b5b0 100644
--- a/modules/system/system.test
+++ b/modules/system/system.test
@@ -1868,12 +1868,23 @@ class UpdateScriptFunctionalTest extends DrupalWebTestCase {
   }
 
   function setUp() {
-    parent::setUp();
+    parent::setUp('system_test');
     $this->update_url = $GLOBALS['base_url'] . '/update.php';
     $this->update_user = $this->drupalCreateUser(array('administer software updates'));
   }
 
   /**
+   * Confirm that the call to registry_rebuild() on update.php fires successfully.
+  */
+  function testUpdateRegistryRebuild() {
+    $this->drupalLogin($this->update_user);
+    $this->drupalGet($this->update_url, array('external' => TRUE));
+    $this->assertResponse(200);
+    // Confirm that hook_registry_files_alter() was invoked.
+    $this->assertText('hook_registry_files_alter() invoked', 'hook_registry_files_alter() was invoked.');
+  }
+
+  /**
    * Tests access to the update script.
    */
   function testUpdateAccess() {
diff --git a/update.php b/update.php
index a777920..c85f4c3 100644
--- a/update.php
+++ b/update.php
@@ -370,6 +370,9 @@ if (empty($op) && update_access_allowed()) {
   // in updated code are picked up.
   module_implements('', FALSE, TRUE);
 
+  // Rebuild the registry so that any classes moved by modules are rescanned.
+  registry_rebuild();
+
   // Set up $language, since the installer components require it.
   drupal_language_initialize();
 
