diff --git b/core/modules/block/block.module a/core/modules/block/block.module
index cb48ff1..7cf9040 100644
--- b/core/modules/block/block.module
+++ a/core/modules/block/block.module
@@ -598,7 +598,7 @@ function block_custom_block_save($edit, $delta) {
  * Implements hook_form_FORM_ID_alter() for user_profile_form().
  */
 function block_form_user_profile_form_alter(&$form, &$form_state) {
-  $account = EntityFormController::getFormInstance($form_state)->getEntity();
+  $account = $form_state['controller']->getEntity();
   $rids = array_keys($account->roles);
   $result = db_query("SELECT DISTINCT b.* FROM {block} b LEFT JOIN {block_role} r ON b.module = r.module AND b.delta = r.delta WHERE b.status = 1 AND b.custom <> 0 AND (r.rid IN (:rids) OR r.rid IS NULL) ORDER BY b.weight, b.module", array(':rids' => $rids));
 
diff --git b/core/modules/book/book.module a/core/modules/book/book.module
index 63f7a60..952f67f 100644
--- b/core/modules/book/book.module
+++ a/core/modules/book/book.module
@@ -425,7 +425,7 @@ function book_get_books() {
  * @see book_pick_book_nojs_submit()
  */
 function book_form_node_form_alter(&$form, &$form_state, $form_id) {
-  $node = EntityFormController::getFormInstance($form_state)->getEntity();
+  $node = $form_state['controller']->getEntity();
   $access = user_access('administer book outlines');
   if (!$access) {
     if (user_access('add content to books') && ((!empty($node->book['mlid']) && !empty($node->nid)) || book_type_is_allowed($node->type))) {
@@ -464,7 +464,7 @@ function book_form_node_form_alter(&$form, &$form_state, $form_id) {
  * @see book_form_node_form_alter()
  */
 function book_pick_book_nojs_submit($form, &$form_state) {
-  $node = EntityFormController::getFormInstance($form_state)->getEntity();
+  $node = $form_state['controller']->getEntity();
   $node->book = $form_state['values']['book'];
   $form_state['rebuild'] = TRUE;
 }
diff --git b/core/modules/comment/comment.module a/core/modules/comment/comment.module
index 945293d..7b24531 100644
--- b/core/modules/comment/comment.module
+++ a/core/modules/comment/comment.module
@@ -108,11 +108,11 @@ function comment_entity_info() {
       'base table' => 'comment',
       'uri callback' => 'comment_uri',
       'fieldable' => TRUE,
-      'entity class' => 'Drupal\comment\Comment',
       'controller class' => 'Drupal\comment\CommentStorageController',
       'form controller class' => array(
         'default' => 'Drupal\comment\CommentFormController',
       ),
+      'entity class' => 'Drupal\comment\Comment',
       'entity keys' => array(
         'id' => 'cid',
         'bundle' => 'node_type',
@@ -1245,7 +1245,7 @@ function comment_form_node_type_form_alter(&$form, $form_state) {
  * Implements hook_form_BASE_FORM_ID_alter().
  */
 function comment_form_node_form_alter(&$form, $form_state) {
-  $node = EntityFormController::getFormInstance($form_state)->getEntity();
+  $node = $form_state['controller']->getEntity();
   $form['comment_settings'] = array(
     '#type' => 'fieldset',
     '#access' => user_access('administer comments'),
diff --git b/core/modules/comment/lib/Drupal/comment/CommentFormController.php a/core/modules/comment/lib/Drupal/comment/CommentFormController.php
index 2eae8da..c322d30 100644
--- b/core/modules/comment/lib/Drupal/comment/CommentFormController.php
+++ a/core/modules/comment/lib/Drupal/comment/CommentFormController.php
@@ -213,7 +213,13 @@ class CommentFormController extends EntityFormController {
       '#type' => 'submit',
       '#value' => t('Preview'),
       '#access' => $preview_mode != DRUPAL_DISABLED,
-      '#submit' => array(array($this, 'preview')),
+      '#validate' => array(
+        array($this, 'validate'),
+      ),
+      '#submit' => array(
+        array($this, 'submit'),
+        array($this, 'preview'),
+      ),
     );
 
     $element['#weight'] = $form['comment_body']['#weight'] + 0.01;
diff --git b/core/modules/contact/contact.module a/core/modules/contact/contact.module
index 625e5d6..da550eb 100644
--- b/core/modules/contact/contact.module
+++ a/core/modules/contact/contact.module
@@ -223,7 +223,7 @@ function contact_form_user_profile_form_alter(&$form, &$form_state) {
     '#weight' => 5,
     '#collapsible' => TRUE,
   );
-  $account = EntityFormController::getFormInstance($form_state)->getEntity();
+  $account = $form_state['controller']->getEntity();
   $form['contact']['contact'] = array(
     '#type' => 'checkbox',
     '#title' => t('Personal contact form'),
diff --git b/core/modules/entity/entity.api.php a/core/modules/entity/entity.api.php
index b200099..98e32b8 100644
--- b/core/modules/entity/entity.api.php
+++ a/core/modules/entity/entity.api.php
@@ -28,11 +28,12 @@
  *     Drupal\entity\EntityStorageControllerInterface interface. Leave blank
  *     to use the Drupal\entity\DatabaseStorageController implementation.
  *   - form controller class: An associative array where the keys are the names
- *     of the different form operations and the values are the names of the form
- *     controller classes. To facilitate the case where an entity form varies
- *     only slightly between different operations, the name of the operation is
- *     passed to the constructor of the form controller class. This way, one
- *     class can be used for multiple operations.
+ *     of the different form operations (such as creation, editing or deletion)
+ *     and the values are the names of the controller classes. To facilitate
+ *     supporting the case where an entity form varies only slightly between
+ *     different operations, the name of the operation is passed also to the
+ *     constructor of the form controller class. This way, one class can be used
+ *     for multiple entity forms.
  *   - base table: (used by Drupal\entity\DatabaseStorageController) The
  *     name of the entity type's base table.
  *   - static cache: (used by Drupal\entity\DatabaseStorageController)
diff --git b/core/modules/entity/entity.module a/core/modules/entity/entity.module
index 5393d17..42bf929 100644
--- b/core/modules/entity/entity.module
+++ a/core/modules/entity/entity.module
@@ -486,10 +486,12 @@ function entity_form_field_validate($entity_type, $form, &$form_state) {
  * @param $entity_type
  *   The type of the entity.
  * @param $operation
- *   (optional) The name of the operation identifying the form controller.
+ *   (optional) The name of an operation, such as creation, editing or deletion,
+ *   identifying the controlled form. Defaults to 'default' which is the usual
+ *   create/edit form.
  *
- * @return Drupal\entity\EntityFormController
- *   An instance of the Drupal\Core\Entity\FormController class.
+ * @return Drupal\entity\EntityFormControllerInterface
+ *   An entity form controller instance.
  */
 function entity_form_controller($entity_type, $operation = 'default') {
   $info = entity_get_info($entity_type);
@@ -540,7 +542,7 @@ function entity_form_id(EntityInterface $entity, $operation = 'default') {
  * @param EntityInterface $entity
  *   The entity to be created or edited.
  * @param $operation
- *   (optional) The operation for the form to be processed.
+ *   (optional) The operation identifying the form to be processed.
  *
  * @return
  *   A $form_state array already filled the entity form controller.
@@ -560,7 +562,7 @@ function entity_form_state_defaults(EntityInterface $entity, $operation = 'defau
  * @param EntityInterface $entity
  *   The entity to be created or edited.
  * @param $operation
- *   (optional) The operation for the form to be submitted.
+ *   (optional) The operation identifying the form to be submitted.
  * @param $form_state
  *   (optional) A keyed array containing the current state of the form.
  *
@@ -579,7 +581,7 @@ function entity_form_submit(EntityInterface $entity, $operation = 'default', &$f
  * @param EntityInterface $entity
  *   The entity to be created or edited.
  * @param $operation
- *   (optional) The operation for the form to be returned.
+ *   (optional) The operation identifying the form to be returned.
  *
  * @return
  *   A rendered edit form for the given entity.
diff --git b/core/modules/entity/lib/Drupal/entity/EntityFormController.php a/core/modules/entity/lib/Drupal/entity/EntityFormController.php
index 30bb2fe..2061ed5 100644
--- b/core/modules/entity/lib/Drupal/entity/EntityFormController.php
+++ a/core/modules/entity/lib/Drupal/entity/EntityFormController.php
@@ -8,9 +8,9 @@
 namespace Drupal\entity;
 
 /**
- * Base for controller for entity edit forms.
+ * Base class for entity form controllers.
  */
-class EntityFormController {
+class EntityFormController implements EntityFormControllerInterface {
 
   /**
    * The form state array for the current form.
@@ -30,37 +30,22 @@ class EntityFormController {
   protected $operation;
 
   /**
-   * Constructs a FormController object.
-   *
-   * @param string $operation
-   *   The name of the current operation.
+   * Implements Drupal\entity\EntityFormControllerInterface::__construct().
    */
   public function __construct($operation) {
     $this->operation = $operation;
   }
 
   /**
-   * Builds an entity form.
-   *
-   * @param $form
-   *   An associative array containing the structure of the form.
-   * @param $form_state
-   *   A reference to a keyed array containing the current state of the form.
-   * @param $entity_type
-   *   The type of the entity being edited.
-   * @param $entity
-   *   The entity being edited.
-   *
-   * @return
-   *   The array containing the complete form.
+   * Implements Drupal\entity\EntityFormControllerInterface::build().
    */
-  public final function build(array $form, array &$form_state, EntityInterface $entity) {
+  public function build(array $form, array &$form_state, EntityInterface $entity) {
     // Check whether we already have a controller in the form state to detect a
     // form rebuild.
-    $controller = self::getFormInstance($form_state);
+    $controller = isset($form_state['controller']) ? $form_state['controller'] : FALSE;
 
     // Set or update the entity form controller in the form state.
-    self::setFormInstance($form_state, $this);
+    $this->setFormInstance($form_state);
 
     // During the initial form build, add the entity to the form state for use
     // during form building and processing. During a rebuild, use what is in the
@@ -92,7 +77,7 @@ class EntityFormController {
   /**
    * Returns the actual form array to be built.
    *
-   * @see EntityFormController::build()
+   * @see Drupal\entity\EntityFormController::build()
    */
   protected function form(array $form, array &$form_state) {
     // @todo Exploit the Property API to generate the default widgets for the
@@ -108,7 +93,7 @@ class EntityFormController {
   /**
    * Returns the action form element for the current entity form.
    */
-  protected final function actionsElement(array $form, array &$form_state) {
+  protected function actionsElement(array $form, array &$form_state) {
     $element = $this->actions($form, $form_state);
 
     // We cannot delete an entity that has not been created yet.
@@ -124,20 +109,11 @@ class EntityFormController {
     }
 
     $count = 0;
-    $validate_callback = array($this, 'validate');
-    $submit_callback = array($this, 'submit');
-
     foreach (element_children($element) as $action) {
       $element[$action] += array(
         '#type' => 'submit',
         '#weight' => ++$count * 5,
-        '#validate' => array(),
-        '#submit' => array(),
       );
-      // Ensure we always validate and preprocess submitted data before calling
-      // the actual form handlers.
-      array_unshift($element[$action]['#validate'], $validate_callback);
-      array_unshift($element[$action]['#submit'], $submit_callback);
     }
 
     if (!empty($element)) {
@@ -155,12 +131,20 @@ class EntityFormController {
       // @todo rename the action key from submit to save.
       'submit' => array(
         '#value' => t('Save'),
-        '#submit' => array(array($this, 'save')),
+        '#validate' => array(
+          array($this, 'validate'),
+        ),
+        '#submit' => array(
+          array($this, 'submit'),
+          array($this, 'save'),
+        ),
       ),
       'delete' => array(
         '#value' => t('Delete'),
         // No need to validate the form when deleting the entity.
-        '#submit' => array(array($this, 'delete')),
+        '#submit' => array(
+          array($this, 'delete'),
+        ),
       ),
       // @todo Consider introducing a 'preview' action here, since it is used by
       // many entity types.
@@ -170,25 +154,20 @@ class EntityFormController {
   /**
    * Form process callback.
    *
-   * @param $form
+   * @param array $form
    *   An associative array containing the structure of the form.
-   * @param $form_state
+   * @param array $form_state
    *   A reference to a keyed array containing the current state of the form.
    */
   public function process($form, &$form_state) {
     // Update the form state reference to ensure that any modification to the
     // entity object is correctly propagated.
-    self::setFormInstance($form_state, $this);
+    $this->setFormInstance($form_state);
     return $form;
   }
 
   /**
-   * Validates the submitted form values.
-   *
-   * @param $form
-   *   An associative array containing the structure of the form.
-   * @param $form_state
-   *   A reference to a keyed array containing the current state of the form.
+   * Implements Drupal\entity\EntityFormControllerInterface::validate().
    */
   public function validate(array $form, array &$form_state) {
     // @todo Exploit the Property API to validate the values submitted for the
@@ -207,15 +186,17 @@ class EntityFormController {
   }
 
   /**
-   * Processes the submitted form values and updates the entity object.
+   * Implements Drupal\entity\EntityFormControllerInterface::submit().
    *
    * This is the default entity object builder function. It is called before any
    * other submit handler to build the new entity object to be passed to the
-   * following submit handlers.
+   * following submit handlers. At this point of the form workflow the entity is
+   * validated and the form state can be updated, this way the subsequently
+   * invoked handlers can retrieve a regular entity object to act on.
    *
-   * @param $form
+   * @param array $form
    *   An associative array containing the structure of the form.
-   * @param $form_state
+   * @param array $form_state
    *   A reference to a keyed array containing the current state of the form.
    */
   public function submit(array $form, array &$form_state) {
@@ -228,9 +209,9 @@ class EntityFormController {
   /**
    * Form submission handler for the 'save' action.
    *
-   * @param $form
+   * @param array $form
    *   An associative array containing the structure of the form.
-   * @param $form_state
+   * @param array $form_state
    *   A reference to a keyed array containing the current state of the form.
    */
   public function save(array $form, array &$form_state) {
@@ -240,9 +221,9 @@ class EntityFormController {
   /**
    * Form submission handler for the 'delete' action.
    *
-   * @param $form
+   * @param array $form
    *   An associative array containing the structure of the form.
-   * @param $form_state
+   * @param array $form_state
    *   A reference to a keyed array containing the current state of the form.
    */
   public function delete(array $form, array &$form_state) {
@@ -250,7 +231,7 @@ class EntityFormController {
   }
 
   /**
-   * Returns the code identifying the active form language.
+   * Implements Drupal\entity\EntityFormControllerInterface::getFormLangcode().
    */
   public function getFormLangcode() {
     // @todo Introduce a new form language type (see hook_language_types_info())
@@ -261,12 +242,7 @@ class EntityFormController {
   }
 
   /**
-   * Build a new entity object from the submitted values.
-   *
-   * @param $form
-   *   An associative array containing the structure of the form.
-   * @param $form_state
-   *   A reference to a keyed array containing the current state of the form.
+   * Implements Drupal\entity\EntityFormControllerInterface::buildEntity().
    */
   public function buildEntity(array $form, array &$form_state) {
     $entity = clone $this->getEntity();
@@ -276,10 +252,7 @@ class EntityFormController {
   }
 
   /**
-   * Returns the form entity.
-   *
-   * @return Drupal\entity\EntityInterface
-   *   The entity being the current form entity.
+   * Implements Drupal\entity\EntityFormControllerInterface::getEntity().
    */
   public function getEntity() {
     return $this->form_state['entity'];
@@ -289,43 +262,27 @@ class EntityFormController {
    * Sets the form entity.
    *
    * @param Drupal\entity\EntityInterface $entity
-   *   The entity being edited in the current form.
+   *   The entity the current form should operate upon.
    */
   protected function setEntity(EntityInterface $entity) {
     $this->form_state['entity'] = $entity;
   }
 
   /**
-   * Prepares the entity object.
+   * Prepares the entity object for editing.
    */
   protected function prepareEntity() {
     // @todo Perform common prepare operations.
   }
 
   /**
-   * Returns an instance of the entity form controller.
-   *
-   * @param $form_state
-   *   The current form state.
-   *
-   * @return Drupal\entity\EntityFormController
-   *   An instance of the entity form controller associated with the current
-   *   form.
-   */
-  public static final function getFormInstance($form_state) {
-    return isset($form_state['controller']) ? $form_state['controller'] : FALSE;
-  }
-
-  /**
-   * Associates the current form controller to the form being edited.
+   * Associates the current form controller to the entity form.
    *
-   * @param $form_state
+   * @param array $form_state
    *   The current form state.
-   * @param EntityFormController $controller
-   *   The current entity form controller.
    */
-  protected static final function setFormInstance(&$form_state, EntityFormController $controller) {
-    $controller->form_state = &$form_state;
-    $form_state['controller'] = $controller;
+  protected function setFormInstance(&$form_state) {
+    $this->form_state = &$form_state;
+    $form_state['controller'] = $this;
   }
 }
diff --git b/core/modules/entity/lib/Drupal/entity/EntityFormControllerInterface.php a/core/modules/entity/lib/Drupal/entity/EntityFormControllerInterface.php
new file mode 100644
index 0000000..12eaa25
--- /dev/null
+++ a/core/modules/entity/lib/Drupal/entity/EntityFormControllerInterface.php
@@ -0,0 +1,92 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\entity\EntityFormControllerInterface.
+ */
+
+namespace Drupal\entity;
+
+/**
+ * Defines a common interface for entity form controller classes.
+ */
+interface EntityFormControllerInterface {
+
+  /**
+   * Constructs a FormController object.
+   *
+   * @param string $operation
+   *   The name of the current operation.
+   */
+  public function __construct($operation);
+
+  /**
+   * Builds an entity form.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param array $form_state
+   *   A reference to a keyed array containing the current state of the form.
+   * @param string $entity_type
+   *   The type of the entity being edited.
+   * @param Drupal\entity\EntityInterface $entity
+   *   The entity being edited.
+   *
+   * @return array
+   *   The array containing the complete form.
+   */
+  public function build(array $form, array &$form_state, EntityInterface $entity);
+
+  /**
+   * Validates the submitted form values.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param array $form_state
+   *   A reference to a keyed array containing the current state of the form.
+   */
+  public function validate(array $form, array &$form_state);
+
+  /**
+   * Processes the submitted form values.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param array $form_state
+   *   A reference to a keyed array containing the current state of the form.
+   */
+  public function submit(array $form, array &$form_state);
+
+  /**
+   * Build a new entity object from the form state values.
+   *
+   * Since this can be used to validate the submitted values, the original form
+   * state object is not altered. Instead a new one is returned.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param array $form_state
+   *   A reference to a keyed array containing the current state of the form.
+   *
+   * @return Drupal\entity\EntityInterface
+   *   A new entity object populated with the values in the form state.
+   */
+  public function buildEntity(array $form, array &$form_state);
+
+  /**
+   * Returns the form entity.
+   *
+   * @return Drupal\entity\EntityInterface
+   *   The current form entity.
+   */
+  public function getEntity();
+
+  /**
+   * Returns the code identifying the active form language.
+   *
+   * @return string
+   *   The form language code.
+   */
+  public function getFormLangcode();
+
+}
diff --git b/core/modules/menu/menu.module a/core/modules/menu/menu.module
index 55acddb..28781a9 100644
--- b/core/modules/menu/menu.module
+++ a/core/modules/menu/menu.module
@@ -632,7 +632,7 @@ function _menu_parent_depth_limit($item) {
 function menu_form_node_form_alter(&$form, $form_state) {
   // Generate a list of possible parents (not including this link or descendants).
   // @todo This must be handled in a #process handler.
-  $node = EntityFormController::getFormInstance($form_state)->getEntity();
+  $node = $form_state['controller']->getEntity();
   $link = $node->menu;
   $type = $node->type;
   // menu_parent_options() is goofy and can actually handle either a menu link
diff --git b/core/modules/node/lib/Drupal/node/NodeFormController.php a/core/modules/node/lib/Drupal/node/NodeFormController.php
index 59f40df..1045dbe 100644
--- b/core/modules/node/lib/Drupal/node/NodeFormController.php
+++ a/core/modules/node/lib/Drupal/node/NodeFormController.php
@@ -21,7 +21,7 @@ class NodeFormController extends EntityFormController {
    * Fills in a few default values, and then invokes hook_prepare() on the node
    * type module, and hook_node_prepare() on all modules.
    *
-   * @see Drupal\entity\EntityFormController::prepareEntity()
+   * Overrides Drupal\entity\EntityFormController::prepareEntity().
    */
   protected function prepareEntity() {
     $node = $this->getEntity();
@@ -272,7 +272,13 @@ class NodeFormController extends EntityFormController {
     $element['preview'] = array(
       '#access' => $preview_mode != DRUPAL_DISABLED,
       '#value' => t('Preview'),
-      '#submit' => array(array($this, 'preview')),
+      '#validate' => array(
+        array($this, 'validate'),
+      ),
+      '#submit' => array(
+        array($this, 'submit'),
+        array($this, 'preview'),
+      ),
     );
 
     $element['submit']['#access'] = $preview_mode != DRUPAL_REQUIRED || (!form_get_errors() && isset($form_state['node_preview']));
@@ -285,9 +291,6 @@ class NodeFormController extends EntityFormController {
    * Overrides Drupal\entity\EntityFormController::validate().
    */
   public function validate(array $form, array &$form_state) {
-    // The entity form controller contains the actual entity being edited, but
-    // we must not update it with form values that have not yet been validated,
-    // so we create an entity clone to use during validation.
     $node = $this->buildEntity($form, $form_state);
     $type = node_type_load($node->type);
 
diff --git b/core/modules/node/tests/modules/node_access_test/node_access_test.module a/core/modules/node/tests/modules/node_access_test/node_access_test.module
index f9d87c7..0498dda 100644
--- b/core/modules/node/tests/modules/node_access_test/node_access_test.module
+++ a/core/modules/node/tests/modules/node_access_test/node_access_test.module
@@ -181,7 +181,7 @@ function node_access_entity_test_page() {
 function node_access_test_form_node_form_alter(&$form, $form_state) {
   // Only show this checkbox for NodeAccessBaseTableTestCase.
   if (variable_get('node_access_test_private')) {
-    $node = EntityFormController::getFormInstance($form_state)->getEntity();
+    $node = $form_state['controller']->getEntity();
     $form['private'] = array(
       '#type' => 'checkbox',
       '#title' => t('Private'),
diff --git b/core/modules/openid/openid.module a/core/modules/openid/openid.module
index 0bb6f6a..853b2fa 100644
--- b/core/modules/openid/openid.module
+++ a/core/modules/openid/openid.module
@@ -233,7 +233,7 @@ function openid_form_user_register_form_alter(&$form, &$form_state) {
       $timezone = current($ax_timezone_values);
     }
     if (in_array($timezone, timezone_identifiers_list())) {
-      $account = EntityFormController::getFormInstance($form_state)->getEntity();
+      $account = $form_state['controller']->getEntity();
       $account->timezone = $timezone;
     }
 
diff --git b/core/modules/overlay/overlay.module a/core/modules/overlay/overlay.module
index 5c353f3..8fefa74 100644
--- b/core/modules/overlay/overlay.module
+++ a/core/modules/overlay/overlay.module
@@ -87,7 +87,7 @@ function overlay_theme() {
  * Implements hook_form_FORM_ID_alter().
  */
 function overlay_form_user_profile_form_alter(&$form, &$form_state) {
-  $account = EntityFormController::getFormInstance($form_state)->getEntity();
+  $account = $form_state['controller']->getEntity();
   if (user_access('access overlay', $account)) {
     $form['overlay_control'] = array(
       '#type' => 'fieldset',
diff --git b/core/modules/path/path.module a/core/modules/path/path.module
index cb0600d..a1e838b 100644
--- b/core/modules/path/path.module
+++ a/core/modules/path/path.module
@@ -102,7 +102,7 @@ function path_menu() {
  * @see path_form_element_validate()
  */
 function path_form_node_form_alter(&$form, $form_state) {
-  $node = EntityFormController::getFormInstance($form_state)->getEntity();
+  $node = $form_state['controller']->getEntity();
   $path = array();
   if (!empty($node->nid)) {
     $conditions = array('source' => 'node/' . $node->nid);
@@ -241,7 +241,7 @@ function path_node_predelete(Node $node) {
 function path_form_taxonomy_term_form_alter(&$form, $form_state) {
   // Make sure this does not show up on the delete confirmation form.
   if (empty($form_state['confirm_delete'])) {
-    $term = EntityFormController::getFormInstance($form_state)->getEntity();
+    $term = $form_state['controller']->getEntity();
     $path = (isset($term->tid) ? path_load('taxonomy/term/' . $term->tid) : array());
     if ($path === FALSE) {
       $path = array();
diff --git b/core/modules/poll/poll.module a/core/modules/poll/poll.module
index ea4c56b..48c8c93 100644
--- b/core/modules/poll/poll.module
+++ a/core/modules/poll/poll.module
@@ -361,7 +361,7 @@ function poll_more_choices_submit($form, &$form_state) {
   // associations in $form_state['input'], so clear that out. This requires
   // poll_form() to rebuild the choices with the values in $node->choice, which
   // it does.
-  $node = EntityFormController::getFormInstance($form_state)->getEntity();
+  $node = $form_state['controller']->getEntity();
   $node->choice = array_values($form_state['values']['choice']);
   unset($form_state['input']['choice']);
   $form_state['rebuild'] = TRUE;
diff --git b/core/modules/system/system.api.php a/core/modules/system/system.api.php
index 2c46b25..beafd58 100644
--- b/core/modules/system/system.api.php
+++ a/core/modules/system/system.api.php
@@ -1185,7 +1185,7 @@ function hook_page_alter(&$page) {
  *
  * One popular use of this hook is to add form elements to the node form. When
  * altering a node form, the node entity can be retrieved by invoking
- * EntityFormController::getFormInstance($form_state)->getEntity().
+ * $form_state['controller']->getEntity().
  *
  * In addition to hook_form_alter(), which is called for all forms, there are
  * two more specific form hooks available. The first,
diff --git b/core/modules/system/system.module a/core/modules/system/system.module
index 821f8ac..02389ce 100644
--- b/core/modules/system/system.module
+++ a/core/modules/system/system.module
@@ -2257,7 +2257,7 @@ function system_user_login(&$edit, $account) {
 function system_user_timezone(&$form, &$form_state) {
   global $user;
 
-  $account = EntityFormController::getFormInstance($form_state)->getEntity();
+  $account = $form_state['controller']->getEntity();
   $form['timezone'] = array(
     '#type' => 'fieldset',
     '#title' => t('Locale settings'),
diff --git b/core/modules/system/tests/modules/taxonomy_test/taxonomy_test.module a/core/modules/system/tests/modules/taxonomy_test/taxonomy_test.module
index fa77904..5dc1616 100644
--- b/core/modules/system/tests/modules/taxonomy_test/taxonomy_test.module
+++ a/core/modules/system/tests/modules/taxonomy_test/taxonomy_test.module
@@ -62,7 +62,7 @@ function taxonomy_test_taxonomy_term_delete(Term $term) {
  * Implements hook_form_FORM_ID_alter().
  */
 function taxonomy_test_form_taxonomy_term_form_alter(&$form, $form_state, $form_id) {
-  $term = EntityFormController::getFormInstance($form_state)->getEntity();
+  $term = $form_state['controller']->getEntity();
   $antonym = taxonomy_test_get_antonym($term->tid);
   $form['advanced']['antonym'] = array(
     '#type' => 'textfield',
diff --git b/core/modules/translation/translation.module a/core/modules/translation/translation.module
index 077f38f..50d021c 100644
--- b/core/modules/translation/translation.module
+++ a/core/modules/translation/translation.module
@@ -155,7 +155,7 @@ function translation_node_type_language_translation_enabled_validate($element, &
  * @see node_form()
  */
 function translation_form_node_form_alter(&$form, &$form_state) {
-  $node = EntityFormController::getFormInstance($form_state)->getEntity();
+  $node = $form_state['controller']->getEntity();
   if (translation_supported_type($node->type)) {
     if (!empty($node->translation_source)) {
       // We are creating a translation. Add values and lock language field.
@@ -382,7 +382,7 @@ function translation_node_update(Node $node) {
  */
 function translation_node_validate(Node $node, $form, &$form_state) {
   // Only act on translatable nodes with a tnid or translation_source.
-  $form_node = EntityFormController::getFormInstance($form_state)->getEntity();
+  $form_node = $form_state['controller']->getEntity();
   if (translation_supported_type($node->type) && (!empty($node->tnid) || !empty($form_node->translation_source->nid))) {
     $tnid = !empty($node->tnid) ? $node->tnid : $form_node->translation_source->nid;
     $translations = translation_node_get_translations($tnid);
diff --git b/core/modules/user/user.module a/core/modules/user/user.module
index 8b174ab..d798e1a 100644
--- b/core/modules/user/user.module
+++ a/core/modules/user/user.module
@@ -148,7 +148,6 @@ function user_entity_info() {
   return array(
     'user' => array(
       'label' => t('User'),
-      'entity class' => 'Drupal\user\User',
       'controller class' => 'Drupal\user\UserStorageController',
       'form controller class' => array(
         'profile' => 'Drupal\user\ProfileFormController',
@@ -158,6 +157,7 @@ function user_entity_info() {
       'uri callback' => 'user_uri',
       'label callback' => 'user_label',
       'fieldable' => TRUE,
+      'entity class' => 'Drupal\user\User',
       'entity keys' => array(
         'id' => 'uid',
         'uuid' => 'uuid',
diff --git b/core/modules/user/user.pages.inc a/core/modules/user/user.pages.inc
index c433c26..9f51683 100644
--- b/core/modules/user/user.pages.inc
+++ a/core/modules/user/user.pages.inc
@@ -215,7 +215,7 @@ function user_edit_cancel_submit($form, &$form_state) {
     unset($_GET['destination']);
   }
   // Note: We redirect from user/uid/edit to user/uid/cancel to make the tabs disappear.
-  $account = EntityFormController::getFormInstance($form_state)->getEntity();
+  $account = $form_state['controller']->getEntity();
   $form_state['redirect'] = array("user/" . $account->uid . "/cancel", array('query' => $destination));
 }
 
