diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index 2664a42..04993f5 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -2865,20 +2865,20 @@ function drupal_get_complete_schema($rebuild = FALSE) {
  *   A UniversalClassLoader class instance (or extension thereof).
  */
 function drupal_classloader() {
-  // Include the Symfony ClassLoader for loading PSR-0-compatible classes.
-  require_once DRUPAL_ROOT . '/core/vendor/Symfony/Component/ClassLoader/UniversalClassLoader.php';
-
   // By default, use the UniversalClassLoader which is best for development,
   // as it does not break when code is moved on the file system. However, as it
   // is slow, allow to use the APC class loader in production.
   static $loader;
 
   if (!isset($loader)) {
+    // Include the Symfony ClassLoader for loading PSR-0-compatible classes.
+    require DRUPAL_ROOT . '/core/vendor/Symfony/Component/ClassLoader/UniversalClassLoader.php';
+
     // @todo Use a cleaner way than variable_get() to switch autoloaders.
     switch (variable_get('autoloader_mode', 'default')) {
       case 'apc':
         if (function_exists('apc_store')) {
-          require_once DRUPAL_ROOT . '/core/vendor/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php';
+          require DRUPAL_ROOT . '/core/vendor/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php';
           $loader = new ApcUniversalClassLoader('drupal.' . $GLOBALS['drupal_hash_salt']);
           break;
         }
@@ -2896,6 +2896,19 @@ function drupal_classloader() {
 }
 
 /**
+ * Registers an additional namespace.
+ *
+ * @param string $name
+ *   The namespace component to register; e.g., 'node'.
+ * @param string $path
+ *   The relative path to the Drupal component in the filesystem.
+ */
+function drupal_classloader_register($name, $path) {
+  $loader = drupal_classloader();
+  $loader->registerNamespace('Drupal\\' . $name, DRUPAL_ROOT . '/' . $path . '/lib');
+}
+
+/**
  * Confirms that an interface is available.
  *
  * This function is rarely called directly. Instead, it is registered as an
diff --git a/core/includes/module.inc b/core/includes/module.inc
index aa9eaf5..60c4035 100644
--- a/core/includes/module.inc
+++ b/core/includes/module.inc
@@ -140,6 +140,7 @@ function system_list($type) {
     // drupal_get_filename() static cache for bootstrap modules only.
     // The rest is stored separately to keep the bootstrap module cache small.
     foreach ($bootstrap_list as $module) {
+      drupal_classloader_register($module->name, dirname($module->filename));
       drupal_get_filename('module', $module->name, $module->filename);
     }
     // We only return the module names here since module_list() doesn't need
@@ -175,6 +176,7 @@ function system_list($type) {
         }
         // Build a list of filenames so drupal_get_filename can use it.
         if ($record->status) {
+          drupal_classloader_register($record->name, dirname($record->filename));
           $lists['filepaths'][] = array('type' => $record->type, 'name' => $record->name, 'filepath' => $record->filename);
         }
       }
diff --git a/core/modules/simpletest/tests/module.test b/core/modules/simpletest/tests/module.test
index c9601c9..54be5d4 100644
--- a/core/modules/simpletest/tests/module.test
+++ b/core/modules/simpletest/tests/module.test
@@ -236,6 +236,38 @@ class ModuleUnitTest extends DrupalWebTestCase {
 }
 
 /**
+ * Tests class loading.
+ */
+class ModuleClassLoaderTestCase extends DrupalWebTestCase {
+  protected $profile = 'testing';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Module class loader',
+      'description' => 'Tests class loading for modules.',
+      'group' => 'Module',
+    );
+  }
+
+  /**
+   * Tests that module-provided classes can be loaded when a module is enabled.
+   */
+  function testClassLoading() {
+    $expected = 'Drupal\\module_autoload_test\\SomeClass::testMethod() was invoked.';
+
+    module_enable(array('module_test', 'module_autoload_test'), FALSE);
+    $this->resetAll();
+    $this->drupalGet('module-test/class-loading');
+    $this->assertText($expected, t('Autoloader loads classes from an enabled module.'));
+
+    module_disable(array('module_autoload_test'), FALSE);
+    $this->resetAll();
+    $this->drupalGet('module-test/class-loading');
+    $this->assertNoText($expected, t('Autoloader does not load classes from a disabled module.'));
+  }
+}
+
+/**
  * Unit tests for module installation.
  */
 class ModuleInstallTestCase extends DrupalWebTestCase {
diff --git a/core/modules/simpletest/tests/module_autoload_test/lib/Drupal/module_autoload_test/SomeClass.php b/core/modules/simpletest/tests/module_autoload_test/lib/Drupal/module_autoload_test/SomeClass.php
new file mode 100644
index 0000000..33c2786
--- /dev/null
+++ b/core/modules/simpletest/tests/module_autoload_test/lib/Drupal/module_autoload_test/SomeClass.php
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\module_autoload_test\SomeClass.
+ */
+
+namespace Drupal\module_autoload_test;
+
+class SomeClass {
+  function testMethod() {
+    return 'Drupal\\module_autoload_test\\SomeClass::testMethod() was invoked.';
+  }
+}
diff --git a/core/modules/simpletest/tests/module_autoload_test/module_autoload_test.info b/core/modules/simpletest/tests/module_autoload_test/module_autoload_test.info
new file mode 100644
index 0000000..b29f162
--- /dev/null
+++ b/core/modules/simpletest/tests/module_autoload_test/module_autoload_test.info
@@ -0,0 +1,6 @@
+name = "Module autoload test"
+description = "Support module for module system tests."
+package = Testing
+version = VERSION
+core = 8.x
+hidden = TRUE
diff --git a/core/modules/simpletest/tests/module_autoload_test/module_autoload_test.module b/core/modules/simpletest/tests/module_autoload_test/module_autoload_test.module
new file mode 100644
index 0000000..a4abe2d
--- /dev/null
+++ b/core/modules/simpletest/tests/module_autoload_test/module_autoload_test.module
@@ -0,0 +1,2 @@
+<?php
+
diff --git a/core/modules/simpletest/tests/module_test.module b/core/modules/simpletest/tests/module_test.module
index bd85049..dd5930a 100644
--- a/core/modules/simpletest/tests/module_test.module
+++ b/core/modules/simpletest/tests/module_test.module
@@ -78,6 +78,11 @@ function module_test_menu() {
     'page callback' => 'module_test_hook_dynamic_loading_invoke_all',
     'access arguments' => array('access content'),
   );
+  $items['module-test/class-loading'] = array(
+    'title' => 'Test loading a class from another module',
+    'page callback' => 'module_test_class_loading',
+    'access callback' => TRUE,
+  );
   return $items;
 }
 
@@ -104,6 +109,21 @@ function module_test_hook_dynamic_loading_invoke_all() {
 }
 
 /**
+ * Page callback for 'class loading' test.
+ *
+ * This module does not have a dependency on module_autoload_test.module. If
+ * that module is enabled, this function should return the string
+ * 'Drupal\\module_autoload_test\\SomeClass::testMethod() was invoked.'. If
+ * that module is not enabled, this function should return nothing.
+ */
+function module_test_class_loading() {
+  if (class_exists('Drupal\module_autoload_test\SomeClass')) {
+    $obj = new Drupal\module_autoload_test\SomeClass();
+    return $obj->testMethod();
+  }
+}
+
+/**
  * Implements hook_modules_enabled().
  */
 function module_test_modules_enabled($modules) {
