diff --git a/core/modules/book/book.module b/core/modules/book/book.module
index f548952..3b93f97 100644
--- a/core/modules/book/book.module
+++ b/core/modules/book/book.module
@@ -126,7 +126,7 @@ function book_node_view_link(EntityInterface $node, $view_mode) {
   if (isset($node->book['depth'])) {
     if ($view_mode == 'full' && node_is_page($node)) {
       $child_type = config('book.settings')->get('child_type');
-      if ((user_access('add content to books') || user_access('administer book outlines')) && node_access('create', $child_type) && $node->status == 1 && $node->book['depth'] < MENU_MAX_DEPTH) {
+      if ((user_access('add content to books') || user_access('administer book outlines')) && node_access('create', entity_create('node', array('type' => $child_type))) && $node->status == 1 && $node->book['depth'] < MENU_MAX_DEPTH) {
         $links['book_add_child'] = array(
           'title' => t('Add child page'),
           'href' => 'node/add/' . $child_type,
diff --git a/core/modules/forum/forum.module b/core/modules/forum/forum.module
index 5f7c9d2..3751f88 100644
--- a/core/modules/forum/forum.module
+++ b/core/modules/forum/forum.module
@@ -175,7 +175,7 @@ function forum_menu_local_tasks(&$data, $router_item, $root_path) {
       // Loop through all bundles for forum taxonomy vocabulary field.
       $field = field_info_field('taxonomy_forums');
       foreach ($field['bundles']['node'] as $type_name) {
-        if (($type = entity_load('node_type', $type_name)) && node_access('create', $type_name)) {
+        if (($type = entity_load('node_type', $type_name)) && node_access('create', entity_create('node', array('type' => $type_name)))) {
           $links[$type_name] = array(
             '#theme' => 'menu_local_action',
             '#link' => array(
diff --git a/core/modules/node/node.api.php b/core/modules/node/node.api.php
index 51abca3..d66d239 100644
--- a/core/modules/node/node.api.php
+++ b/core/modules/node/node.api.php
@@ -546,18 +546,17 @@ function hook_node_load($nodes, $types) {
  * the default home page at path 'node', a recent content block, etc.) See
  * @link node_access Node access rights @endlink for a full explanation.
  *
- * @param Drupal\Core\Entity\EntityInterface|string $node
- *   Either a node entity or the machine name of the content type on which to
- *   perform the access check.
+ * @param Drupal\Core\Entity\EntityInterface $node
+ *   The node entity on which to perform the access check.
  * @param string $op
  *   The operation to be performed. Possible values:
  *   - "create"
  *   - "delete"
  *   - "update"
  *   - "view"
- * @param object $account
+ * @param Drupal\Core\Session\AccountInterface $account
  *   The user object to perform the access check operation on.
- * @param object $langcode
+ * @param string $langcode
  *   The language code to perform the access check operation on.
  *
  * @return string
@@ -567,8 +566,8 @@ function hook_node_load($nodes, $types) {
  *
  * @ingroup node_access
  */
-function hook_node_access($node, $op, $account, $langcode) {
-  $type = is_string($node) ? $node : $node->type;
+function hook_node_access(EntityInterface $node, $op, AccountInterface $account, $langcode) {
+  $type = $node->type;
 
   $configured_types = node_permissions_get_configured_types();
   if (isset($configured_types[$type])) {
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index b9c5bd3..87adb72 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -16,6 +16,7 @@
 use Drupal\Core\Database\Query\SelectExtender;
 use Drupal\Core\Database\Query\SelectInterface;
 use Drupal\Core\Datetime\DrupalDateTime;
+use Drupal\Core\Session\AccountInterface;
 use Drupal\node\NodeTypeInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Template\Attribute;
@@ -1234,7 +1235,7 @@ function _node_revision_access(EntityInterface $node, $op = 'view', $account = N
 function _node_add_access() {
   $types = node_type_get_types();
   foreach ($types as $type) {
-    if (node_access('create', $type->type)) {
+    if (node_access('create', entity_create('node', array('type' => $type->type)))) {
       return TRUE;
     }
   }
@@ -2131,20 +2132,20 @@ function node_form_system_themes_admin_form_submit($form, &$form_state) {
 /**
  * Access callback: Checks a user's permission for performing a node operation.
  *
- * @param $op
+ * @param string $op
  *   The operation to be performed on the node. Possible values are:
  *   - "view"
  *   - "update"
  *   - "delete"
  *   - "create"
- * @param Drupal\Core\Entity\EntityInterface|string|stdClass $node
- *   The node entity on which the operation is to be performed, or the node type
- *   object, or node type string (e.g., 'forum') for the 'create' operation.
- * @param $account
+ * @param Drupal\Core\Entity\EntityInterface $node
+ *   The node entity on which the operation is to be performed. For the 'create'
+ *   operation a temporary node entity with the node type set is sufficient.
+ * @param Drupal\Core\Session\AccountInterface $account
  *   (optional) A user object representing the user for whom the operation is to
  *   be performed. Determines access for a user other than the current user.
  *   Defaults to NULL.
- * @param $langcode
+ * @param string $langcode
  *   (optional) Language code for the variant of the node. Different language
  *   variants might have different permissions associated. If NULL, the
  *   original langcode of the node is used. Defaults to NULL.
@@ -2154,14 +2155,7 @@ function node_form_system_themes_admin_form_submit($form, &$form_state) {
  *
  * @see node_menu()
  */
-function node_access($op, $node, $account = NULL, $langcode = NULL) {
-  if (!$node instanceof EntityInterface) {
-    $node = entity_create('node', array('type' => $node));
-  }
-  elseif ($node instanceof NodeTypeInterface) {
-    $node = entity_create('node', array('type' => $node->id()));
-  }
-
+function node_access($op, EntityInterface $node, AccountInterface $account = NULL, $langcode = NULL) {
   // If no language code was provided, default to the node's langcode.
   if (empty($langcode)) {
     $langcode = $node->langcode;
diff --git a/core/modules/node/node.pages.inc b/core/modules/node/node.pages.inc
index af8e1e7..f21a3fa 100644
--- a/core/modules/node/node.pages.inc
+++ b/core/modules/node/node.pages.inc
@@ -28,7 +28,7 @@ function node_add_page() {
   $content = array();
   // Only use node types the user has access to.
   foreach (node_type_get_types() as $type) {
-    if (node_access('create', $type->type)) {
+    if (node_access('create', entity_create('node', array('type' => $type->type)))) {
       $content[$type->type] = $type;
     }
   }
