diff --git a/core/lib/Drupal/Core/Extension/ExtensionBase.php b/core/lib/Drupal/Core/Extension/ExtensionBase.php
new file mode 100644
index 0000000..0d3d19f
--- /dev/null
+++ b/core/lib/Drupal/Core/Extension/ExtensionBase.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Extension\ExtensionBase
+ */
+
+namespace Drupal\Core\Extension;
+
+use Doctrine\Common\Collections\ArrayCollection;
+
+/**
+ * Defines a base class for Drupal extensions.
+ *
+ * Things which are extensions: Modules, themes, and profiles.
+ */
+abstract class ExtensionBase extends ArrayCollection implements ExtensionInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getName() {
+    return $this->get('name');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getVersion() {
+    return $this->get('version');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDescription() {
+    return $this->get('description');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDependencies() {
+    return $this->get('dependencies') ?: array();
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Extension/ExtensionInterface.php b/core/lib/Drupal/Core/Extension/ExtensionInterface.php
new file mode 100644
index 0000000..63668aa
--- /dev/null
+++ b/core/lib/Drupal/Core/Extension/ExtensionInterface.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Extension\ExtensionInterface.
+ */
+
+namespace Drupal\Core\Extension;
+
+/**
+ * Common interface for extensions.
+ */
+interface ExtensionInterface {
+
+  /**
+   * Gets the extension's name.
+   *
+   * @return string
+   *   The extension's name.
+   */
+  public function getName();
+
+  /**
+   * Gets the extension's version.
+   *
+   * @return string
+   *   The extension's version.
+   */
+  public function getVersion();
+
+  /**
+   * Gets the extension's description.
+   *
+   * @return string|null
+   *   The extension's description or NULL if none has been set.
+   */
+  public function getDescription();
+
+  /**
+   * Gets the extension's configured dependencies.
+   *
+   * This list only contains the dependencies explicitly defined in the
+   * extensions's .info.yml file and does not represent the entire dependency
+   * graph as determined by Drupal.
+   *
+   * @return array
+   *   An array of strings which are the names of dependencies.
+   */
+  public function getDependencies();
+
+}
diff --git a/core/lib/Drupal/Core/Extension/Module.php b/core/lib/Drupal/Core/Extension/Module.php
new file mode 100644
index 0000000..973462f
--- /dev/null
+++ b/core/lib/Drupal/Core/Extension/Module.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Extension\Module.
+ */
+
+namespace Drupal\Core\Extension;
+
+/**
+ * Defines a module extension class.
+ */
+class Module extends ExtensionBase implements ModuleInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isInstalled() {
+    return (bool) $this->get('status');
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Extension/ModuleInterface.php b/core/lib/Drupal/Core/Extension/ModuleInterface.php
new file mode 100644
index 0000000..8027594
--- /dev/null
+++ b/core/lib/Drupal/Core/Extension/ModuleInterface.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Extension\ModuleInterface.
+ */
+
+namespace Drupal\Core\Extension;
+
+/**
+ * Common interface for module extension classes.
+ *
+ * The information are coming from the $profile.info.yml file.
+ */
+interface ModuleInterface extends ExtensionInterface {
+
+  /**
+   * Gets the module's current status.
+   *
+   * @return bool
+   *   TRUE if the module is currently installed, FALSE otherwise.
+   */
+  public function isInstalled();
+
+}
diff --git a/core/lib/Drupal/Core/Extension/Profile.php b/core/lib/Drupal/Core/Extension/Profile.php
new file mode 100644
index 0000000..c2dd10b
--- /dev/null
+++ b/core/lib/Drupal/Core/Extension/Profile.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Extension\Profile.
+ */
+
+namespace Drupal\Core\Extension;
+
+/**
+ * Defines a profile extension class.
+ */
+class Profile extends ExtensionBase implements ProfileInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isActive() {
+    return (bool) $this->get('status');
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Extension/ProfileInterface.php b/core/lib/Drupal/Core/Extension/ProfileInterface.php
new file mode 100644
index 0000000..f1c6a05
--- /dev/null
+++ b/core/lib/Drupal/Core/Extension/ProfileInterface.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Extension\ProfileInterface.
+ */
+
+namespace Drupal\Core\Extension;
+
+/**
+ * Common interface for installation profiles.
+ *
+ * The information are coming from the $profile.info.yml file.
+ */
+interface ProfileInterface extends ExtensionInterface {
+
+  /**
+   * Determines if this is the active profile.
+   *
+   * @return bool
+   *   TRUE if this is the active profile, FALSE otherwise.
+   */
+  public function isActive();
+
+}
diff --git a/core/lib/Drupal/Core/Extension/Theme.php b/core/lib/Drupal/Core/Extension/Theme.php
new file mode 100644
index 0000000..b85eb3f
--- /dev/null
+++ b/core/lib/Drupal/Core/Extension/Theme.php
@@ -0,0 +1,85 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Extension\Theme.
+ */
+
+namespace Drupal\Core\Extension;
+
+/**
+ * Defines a theme extension class.
+ *
+ * Parsed from a theme .info.yml file.
+ *
+ * Some possible keys:
+ *
+ *   - name: The real name of the theme for display purposes.
+ *   - description: Brief description.
+ *   - screenshot: Path to screenshot relative to the theme's .info.yml file.
+ *   - engine: Theme engine; typically twig.
+ *   - base theme: Name of a base theme, if applicable.
+ *   - regions: Listed regions.
+ *   - features: Features available.
+ *   - stylesheets: Theme stylesheets.
+ *   - scripts: Theme scripts.
+ */
+class Theme extends ExtensionBase implements ThemeInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getScreenshot() {
+    return $this->get('screenshot');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getEngine() {
+    return $this->get('engine');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBaseTheme() {
+    return $this->get('base theme');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getStylesheets() {
+    return $this->get('stylesheets') ?: array();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getScripts() {
+    return $this->get('scripts') ?: array();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRegions() {
+    return $this->get('regions') ?: array();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFeatures() {
+    return $this->get('regions') ?: array();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isEnabled() {
+    return (bool) $this->get('status');
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Extension/ThemeInterface.php b/core/lib/Drupal/Core/Extension/ThemeInterface.php
new file mode 100644
index 0000000..d70dc6f
--- /dev/null
+++ b/core/lib/Drupal/Core/Extension/ThemeInterface.php
@@ -0,0 +1,82 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Extension\ThemeInterface.
+ */
+
+namespace Drupal\Core\Extension;
+
+/**
+ * Common interface for themes.
+ *
+ * The information are coming from the $theme.info.yml file.
+ */
+interface ThemeInterface extends ExtensionInterface {
+
+  /**
+   * Gets the theme's base theme name.
+   *
+   * @return string|null
+   *   The name of the base theme or NULL if it has no base theme.
+   */
+  public function getBaseTheme();
+
+  /**
+   * Gets the theme's screenshot filepath.
+   *
+   * @return string|null
+   *   The theme's screenshot filepath relative to the theme root or NULL if
+   *   none has been defined.
+   */
+  public function getScreenshot();
+
+  /**
+   * Gets the theming engine used by the theme.
+   *
+   * @return string|null
+   *   The theming engine used by the theme or NULL if none has been defined.
+   */
+  public function getEngine();
+
+  /**
+   * Gets the theme's stylesheets.
+   *
+   * @return array
+   *   The theme's stylesheets.
+   */
+  public function getStylesheets();
+
+  /**
+   * Gets the theme's JavaScript files.
+   *
+   * @return array
+   *   The theme's JavaScript files.
+   */
+  public function getScripts();
+
+  /**
+   * Gets the theme's regions.
+   *
+   * @return array
+   *   The theme's regions.
+   */
+  public function getRegions();
+
+  /**
+   * Gets the theme's supported features.
+   *
+   * @return array
+   *   The theme's supported features.
+   */
+  public function getFeatures();
+
+  /**
+   * Gets the themes's current status.
+   *
+   * @return bool
+   *   TRUE if the theme is currently enabled, FALSE otherwise.
+   */
+  public function isEnabled();
+
+}
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index f4bf194..3821db4 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -7,6 +7,9 @@
 
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Cache\Cache;
+use Drupal\Core\Extension\Module;
+use Drupal\Core\Extension\Profile;
+use Drupal\Core\Extension\Theme;
 use Drupal\Core\Language\Language;
 use Drupal\Core\Utility\ModuleInfo;
 use Drupal\user\UserInterface;
@@ -2268,7 +2271,7 @@ function system_get_info($type, $name = NULL) {
     $data = system_rebuild_module_data();
     foreach (\Drupal::moduleHandler()->getModuleList() as $module => $filename) {
       if (isset($data[$module])) {
-        $info[$module] = $data[$module]->info;
+        $info[$module] = new Module($data[$module]->info);
       }
     }
   }
@@ -2276,7 +2279,12 @@ function system_get_info($type, $name = NULL) {
     $list = system_list($type);
     foreach ($list as $shortname => $item) {
       if (!empty($item->status)) {
-        $info[$shortname] = $item->info;
+        if ($type == 'profile') {
+          $info[$shortname] = new Profile($info);
+        }
+        elseif ($type == 'theme') {
+          $info[$shortname] = new Theme($info);
+        }
       }
     }
   }
