diff --git a/core/lib/Drupal/Core/Updater/Module.php b/core/lib/Drupal/Core/Updater/Module.php
index 06e1c1e..a28768d 100644
--- a/core/lib/Drupal/Core/Updater/Module.php
+++ b/core/lib/Drupal/Core/Updater/Module.php
@@ -51,10 +51,9 @@ public function isInstalled() {
    * Implements Drupal\Core\Updater\UpdaterInterface::canUpdateDirectory().
    */
   public static function canUpdateDirectory($directory) {
-    if (file_scan_directory($directory, '/.*\.module$/')) {
-      return TRUE;
-    }
-    return FALSE;
+    $info = static::getExtensionInfo($directory);
+
+    return (isset($info['type']) && $info['type'] == 'module');
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Updater/Theme.php b/core/lib/Drupal/Core/Updater/Theme.php
index ea853c8..cb4addb 100644
--- a/core/lib/Drupal/Core/Updater/Theme.php
+++ b/core/lib/Drupal/Core/Updater/Theme.php
@@ -51,11 +51,9 @@ public function isInstalled() {
    * Implements Drupal\Core\Updater\UpdaterInterface::canUpdateDirectory().
    */
   static function canUpdateDirectory($directory) {
-    // This is a lousy test, but don't know how else to confirm it is a theme.
-    if (file_scan_directory($directory, '/.*\.module$/')) {
-      return FALSE;
-    }
-    return TRUE;
+    $info = static::getExtensionInfo($directory);
+
+    return (isset($info['type']) && $info['type'] == 'theme');
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Updater/Updater.php b/core/lib/Drupal/Core/Updater/Updater.php
index dce5a3f..00f94b9 100644
--- a/core/lib/Drupal/Core/Updater/Updater.php
+++ b/core/lib/Drupal/Core/Updater/Updater.php
@@ -112,6 +112,28 @@ public static function findInfoFile($directory) {
   }
 
   /**
+   * Get Extension information from directory.
+   *
+   * @param string $directory
+   *   Directory to search in.
+   *
+   * @return array
+   *   Extension info.
+   *
+   * @throws \Drupal\Core\Updater\UpdaterException
+   *   If the info parser does not provide any info.
+   */
+  protected static function getExtensionInfo($directory) {
+    $info_file = static::findInfoFile($directory);
+    $info = \Drupal::service('info_parser')->parse($info_file);
+    if (empty($info)) {
+      throw new UpdaterException(t('Unable to parse info file: %info_file.', ['%info_file' => $info_file]));
+    }
+
+    return $info;
+  }
+
+  /**
    * Gets the name of the project directory (basename).
    *
    * @todo It would be nice, if projects contained an info file which could
diff --git a/core/lib/Drupal/Core/Updater/UpdaterInterface.php b/core/lib/Drupal/Core/Updater/UpdaterInterface.php
index 50a1409..66e2302 100644
--- a/core/lib/Drupal/Core/Updater/UpdaterInterface.php
+++ b/core/lib/Drupal/Core/Updater/UpdaterInterface.php
@@ -45,8 +45,6 @@ public function getInstallDirectory();
   /**
    * Determines if the Updater can handle the project provided in $directory.
    *
-   * @todo Provide something more rational here, like a project spec file.
-   *
    * @param string $directory
    *
    * @return bool
diff --git a/core/modules/update/src/Tests/UpdateUploadTest.php b/core/modules/update/src/Tests/UpdateUploadTest.php
index 0565ff0..8bb7535 100644
--- a/core/modules/update/src/Tests/UpdateUploadTest.php
+++ b/core/modules/update/src/Tests/UpdateUploadTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\update\Tests;
 
+use Drupal\Core\Updater\Updater;
 use Drupal\Core\Url;
 
 /**
@@ -111,4 +112,16 @@ function testUpdateManagerCoreSecurityUpdateMessages() {
     $this->drupalGet('admin/update/ready');
     $this->assertNoText(t('There is a security update available for your version of Drupal.'));
   }
+
+  /**
+   * Tests only an *.info.yml file are detected without supporting files.
+   */
+  public function testUpdateDirectory() {
+    $type = Updater::getUpdaterFromDirectory(\Drupal::root() . '/core/modules/update/tests/modules/aaa_update_test');
+    $this->assertEqual($type, 'Drupal\\Core\\Updater\\Module', 'Detected a Module');
+
+    $type = Updater::getUpdaterFromDirectory(\Drupal::root() . '/core/modules/update/tests/themes/update_test_basetheme');
+    $this->assertEqual($type, 'Drupal\\Core\\Updater\\Theme', 'Detected a Theme.');
+  }
+
 }
