diff --git a/core/lib/Drupal/Core/Extension/ModuleHandler.php b/core/lib/Drupal/Core/Extension/ModuleHandler.php
index b9a9a3e..8fc60c6 100644
--- a/core/lib/Drupal/Core/Extension/ModuleHandler.php
+++ b/core/lib/Drupal/Core/Extension/ModuleHandler.php
@@ -712,4 +712,11 @@ public function getName($module) {
     return isset($info['name']) ? $info['name'] : $module;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function isCoreCompatible($core) {
+    return substr(\Drupal::CORE_COMPATIBILITY, 0, 1) == substr($core, 0, 1) && !version_compare(\Drupal::VERSION, $core, '<');
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Extension/ModuleHandlerInterface.php b/core/lib/Drupal/Core/Extension/ModuleHandlerInterface.php
index 3d61d2e..09d05f2 100644
--- a/core/lib/Drupal/Core/Extension/ModuleHandlerInterface.php
+++ b/core/lib/Drupal/Core/Extension/ModuleHandlerInterface.php
@@ -314,4 +314,15 @@ public function getModuleDirectories();
    */
   public function getName($module);
 
+  /**
+   * Check a module's core compatibility
+   *
+   * @param string $core
+   *   The value of the core key in a module .info.yml file.
+   *
+   * @return bool
+   *   FALSE if invalid or incompatible, TRUE otherwise.
+   */
+  public function isCoreCompatible($core);
+
 }
diff --git a/core/modules/system/src/Controller/SystemController.php b/core/modules/system/src/Controller/SystemController.php
index 84e6ac5..11c8e61 100644
--- a/core/modules/system/src/Controller/SystemController.php
+++ b/core/modules/system/src/Controller/SystemController.php
@@ -240,7 +240,7 @@ public function themesPage() {
 
       if (empty($theme->status)) {
         // Ensure this theme is compatible with this version of core.
-        $theme->incompatible_core = !isset($theme->info['core']) || ($theme->info['core'] != \DRUPAL::CORE_COMPATIBILITY);
+        $theme->incompatible_core = !isset($theme->info['core']) || !$this->moduleHandler()->isCoreCompatible($theme->info['core']) || !isset($theme->info['regions']['content']);
         // Require the 'content' region to make sure the main page
         // content has a common place in all themes.
         $theme->incompatible_region = !isset($theme->info['regions']['content']);
diff --git a/core/modules/system/src/Form/ModulesListForm.php b/core/modules/system/src/Form/ModulesListForm.php
index e8a6cea..075e912 100644
--- a/core/modules/system/src/Form/ModulesListForm.php
+++ b/core/modules/system/src/Form/ModulesListForm.php
@@ -275,7 +275,7 @@ protected function buildRow(array $modules, Extension $module, $distribution) {
     $reasons = array();
 
     // Check the core compatibility.
-    if ($module->info['core'] != \Drupal::CORE_COMPATIBILITY) {
+    if (!$this->moduleHandler->isCoreCompatible($module->info['core'])) {
       $compatible = FALSE;
       $reasons[] = $this->t('This version is not compatible with Drupal @core_version and should be replaced.', array(
         '@core_version' => \Drupal::CORE_COMPATIBILITY,
@@ -320,7 +320,7 @@ protected function buildRow(array $modules, Extension $module, $distribution) {
         }
         // Disable the checkbox if the dependency is incompatible with this
         // version of Drupal core.
-        elseif ($modules[$dependency]->info['core'] != \Drupal::CORE_COMPATIBILITY) {
+        elseif (!$this->moduleHandler->isCoreCompatible($modules[$dependency]->info['core'])) {
           $row['#requires'][$dependency] = $this->t('@module (<span class="admin-missing">incompatible with</span> this version of Drupal core)', array(
             '@module' => $name,
           ));
diff --git a/core/modules/system/src/Tests/Module/DependencyTest.php b/core/modules/system/src/Tests/Module/DependencyTest.php
index e9162a8..cc2f0d0 100644
--- a/core/modules/system/src/Tests/Module/DependencyTest.php
+++ b/core/modules/system/src/Tests/Module/DependencyTest.php
@@ -96,6 +96,24 @@ function testIncompatibleCoreVersionDependency() {
   }
 
   /**
+   * Tests enabling modules with different core version specifications.
+   */
+  function testCoreVersionDependency() {
+    $this->drupalGet('admin/modules');
+    $checkbox = $this->xpath('//input[@type="checkbox" and @disabled="disabled" and @name="modules[Testing][system_incompatible_core_version_test_9x][enable]"]');
+    $this->assert(count($checkbox) == 1, 'Checkbox for the 9.x module is disabled.');
+    $checkbox = $this->xpath('//input[@type="checkbox" and @disabled="disabled" and @name="modules[Testing][system_compatible_core_version_test_80x][enable]"]');
+    $this->assert(count($checkbox) == 0, 'Checkbox for the 8.0.x module is not disabled.');
+    $checkbox = $this->xpath('//input[@type="checkbox"  and @name="modules[Testing][system_compatible_core_version_test_80x][enable]"]');
+    $this->assert(count($checkbox) == 1, 'Checkbox for the 8.0.x module is present.');
+    // Attempt to install the module.
+    $edit = array();
+    $edit['modules[Testing][system_compatible_core_version_test_80x][enable]'] = 'system_compatible_core_version_test_80x';
+    $this->drupalPostForm('admin/modules', $edit, t('Save configuration'));
+    $this->assertModules(array('system_compatible_core_version_test_80x'), TRUE);
+  }
+
+  /**
    * Tests enabling a module that depends on a module which fails hook_requirements().
    */
   function testEnableRequirementsFailureDependency() {
diff --git a/core/modules/system/tests/modules/system_compatible_core_version_test_80x/system_compatible_core_version_test_80x.info.yml b/core/modules/system/tests/modules/system_compatible_core_version_test_80x/system_compatible_core_version_test_80x.info.yml
new file mode 100644
index 0000000..eeb9970
--- /dev/null
+++ b/core/modules/system/tests/modules/system_compatible_core_version_test_80x/system_compatible_core_version_test_80x.info.yml
@@ -0,0 +1,6 @@
+name: 'System compatible core 8.0.x version test'
+type: module
+description: 'Support module for testing system dependencies.'
+package: Testing
+version: VERSION
+core: 8.0.x
diff --git a/core/modules/system/tests/modules/system_incompatible_core_version_test_9x/system_incompatible_core_version_test_9x.info.yml b/core/modules/system/tests/modules/system_incompatible_core_version_test_9x/system_incompatible_core_version_test_9x.info.yml
new file mode 100644
index 0000000..4bc6e45
--- /dev/null
+++ b/core/modules/system/tests/modules/system_incompatible_core_version_test_9x/system_incompatible_core_version_test_9x.info.yml
@@ -0,0 +1,6 @@
+name: 'System incompatible core 9.x version test'
+type: module
+description: 'Support module for testing system dependencies.'
+package: Testing
+version: 9.0.0
+core: 9.x
diff --git a/core/modules/system/tests/modules/system_test/system_test.module b/core/modules/system/tests/modules/system_test/system_test.module
index eef3516..c8de1eb 100644
--- a/core/modules/system/tests/modules/system_test/system_test.module
+++ b/core/modules/system/tests/modules/system_test/system_test.module
@@ -66,6 +66,8 @@ function system_test_system_info_alter(&$info, Extension $file, $type) {
     'system_incompatible_core_version_dependencies_test',
     'system_incompatible_module_version_test',
     'system_incompatible_core_version_test',
+    'system_incompatible_core_version_test_9x',
+    'system_compatible_core_version_test_80x',
   ))) {
     $info['hidden'] = FALSE;
   }
diff --git a/core/tests/Drupal/Tests/Core/Extension/ModuleHandlerTest.php b/core/tests/Drupal/Tests/Core/Extension/ModuleHandlerTest.php
index c7dd97f..8920634 100644
--- a/core/tests/Drupal/Tests/Core/Extension/ModuleHandlerTest.php
+++ b/core/tests/Drupal/Tests/Core/Extension/ModuleHandlerTest.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Extension\Extension;
 use Drupal\Core\Extension\ModuleHandler;
 use Drupal\Tests\UnitTestCase;
+use Symfony\Component\Validator\Constraints\False;
 
 /**
  * @coversDefaultClass \Drupal\Core\Extension\ModuleHandler
@@ -516,4 +517,43 @@ public function testGetModuleDirectories() {
     $this->moduleHandler->addModule('module', 'place');
     $this->assertEquals(array('module' => $this->root . '/place'), $this->moduleHandler->getModuleDirectories());
   }
+
+  /**
+   * @dataProvider providerIsCoreCompatible
+   * @covers ::isCoreCompatible
+   */
+  public function testIsCoreCompatible($version, $compatible) {
+    $this->assertEquals($compatible, $this->moduleHandler->isCoreCompatible($version));
+  }
+
+  /**
+   * Provides data for the invalid core test.
+   *
+   * @return array
+   *   An array of versions and whether they should be valid.
+   */
+  public function providerIsCoreCompatible() {
+    $current = \Drupal::VERSION;
+    list($major, $minor) = explode('.', $current);
+
+    // Calculate older and newer.
+    $older = $major - 1;
+    $newer = $major + 1;
+    $newer_minor = $major . '.' . ($minor + 1);
+
+    // Core version => valid.
+    $versions = array(
+      // Invalid.
+      array("{$older}.x", FALSE),
+      array("{$older}.24", FALSE),
+      array("{$newer_minor}.x", FALSE),
+      array("{$newer}.0.x", FALSE),
+      // Valid.
+      array("{$major}.x", TRUE),
+      array("{$major}.{$minor}.x", TRUE),
+    );
+
+    return $versions;
+  }
+
 }
