diff --git a/core/lib/Drupal/Core/Entity/EntityPublishedInterface.php b/core/lib/Drupal/Core/Entity/EntityPublishedInterface.php
new file mode 100644
index 0000000..77dcb2b
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/EntityPublishedInterface.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Drupal\Core\Entity;
+
+/**
+ * Provides an interface for access to an entity's published state.
+ */
+interface EntityPublishedInterface {
+
+  /**
+   * Returns whether or not the entity is published.
+   *
+   * @return bool
+   *   TRUE if the entity is published, FALSE otherwise.
+   */
+  public function isPublished();
+
+  /**
+   * Sets the entity as published.
+   *
+   * @return $this
+   */
+  public function publish();
+
+  /**
+   * Sets the entity as unpublished.
+   *
+   * @return $this
+   */
+   public function unpublish();
+
+}
diff --git a/core/lib/Drupal/Core/Entity/EntityPublishedTrait.php b/core/lib/Drupal/Core/Entity/EntityPublishedTrait.php
index 2145f4a..2e9d4c2 100644
--- a/core/lib/Drupal/Core/Entity/EntityPublishedTrait.php
+++ b/core/lib/Drupal/Core/Entity/EntityPublishedTrait.php
@@ -20,7 +20,7 @@
    *   Array of base field definitions.
    */
   public static function publishedBaseFieldDefinitions(EntityTypeInterface $entity_type) {
-    $key = $entity_type->hasKey('status') ? $entity_type->getKey('status') : 'status';
+    $key = static::getPublishedEntityKey($entity_type);
     return [$key => BaseFieldDefinition::create('boolean')
       ->setLabel(new TranslatableMarkup('Publishing status'))
       ->setDescription(new TranslatableMarkup('A boolean indicating the published state.'))
@@ -30,14 +30,11 @@ public static function publishedBaseFieldDefinitions(EntityTypeInterface $entity
   }
 
   /**
-   * Returns the published status of the entity.
-   *
-   * @return bool
-   *   The published status of the entity.
+   * {@inheritdoc}
    */
   public function isPublished() {
-    $status = $this->getEntityKey('status');
-    return (bool) (isset($status) ? $status : $this->get('status')->value);
+    $key = static::getPublishedEntityKey($this->getEntityType());
+    return (bool) $this->get($key)->value;
   }
 
   /**
@@ -46,16 +43,57 @@ public function isPublished() {
    * @param bool $published
    *   A boolean value denoting the published status.
    *
-   * @return \Drupal\Core\Entity\ContentEntityInterface $this
-   *   The Content Entity object.
+   * @return $this
+   *
+   * @deprecated in Drupal 8.3.0, will be removed before Drupal 9.0.0. Use
+   *   \Drupal\Core\Entity\EntityPublishedInterface::publish() and
+   *   \Drupal\Core\Entity\EntityPublishedInterface::unpublish() instead.
    */
   public function setPublished($published) {
-    /** @var \Drupal\Core\Entity\ContentEntityTypeInterface $entity_type */
-    $key = $this->getEntityType()->getKey('status') ?: 'status';
-    // @todo: Replace values with constants from EntityPublishedInterface or
-    // similar when introduced. https://www.drupal.org/node/2811667
-    $this->set($key, $published ? 1 : 0);
+    if ((bool) $published) {
+      $this->publish();
+    }
+    else {
+      $this->unpublish();
+    }
+
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function publish() {
+    $key = static::getPublishedEntityKey($this->getEntityType());
+    $this->set($key, TRUE);
+
     return $this;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function unpublish() {
+    $key = static::getPublishedEntityKey($this->getEntityType());
+    $this->set($key, FALSE);
+
+    return $this;
+  }
+
+  /**
+   * Used to determine which key is used to represent the published state.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
+   *   The entity type to find the published key for.
+   *
+   * @return string
+   *   The configured entity type definition key for 'status', or defaults to
+   *   'status'.
+   *
+   * @see \Drupal\Core\Entity\Annotation\ContentEntityType
+   */
+  protected static function getPublishedEntityKey(EntityTypeInterface $entity_type) {
+    return $entity_type->getKey('status') ?: 'status';
+  }
+
 }
diff --git a/core/modules/comment/src/CommentInterface.php b/core/modules/comment/src/CommentInterface.php
index 28318ee..a35b7ad 100644
--- a/core/modules/comment/src/CommentInterface.php
+++ b/core/modules/comment/src/CommentInterface.php
@@ -3,13 +3,14 @@
 namespace Drupal\comment;
 
 use Drupal\Core\Entity\ContentEntityInterface;
+use Drupal\Core\Entity\EntityPublishedInterface;
 use Drupal\user\EntityOwnerInterface;
 use Drupal\Core\Entity\EntityChangedInterface;
 
 /**
  * Provides an interface defining a comment entity.
  */
-interface CommentInterface extends ContentEntityInterface, EntityChangedInterface, EntityOwnerInterface {
+interface CommentInterface extends ContentEntityInterface, EntityChangedInterface, EntityOwnerInterface, EntityPublishedInterface {
 
   /**
    * Comment is awaiting approval.
@@ -215,6 +216,10 @@ public function getStatus();
    *
    * @return \Drupal\comment\CommentInterface
    *   The class instance that this method is called on.
+   *
+   * @deprecated in Drupal 8.3.0, will be removed before Drupal 9.0.0. Use
+   *   \Drupal\Core\Entity\EntityPublishedInterface::publish() and
+   *   \Drupal\Core\Entity\EntityPublishedInterface::unpublish() instead.
    */
   public function setPublished($status);
 
diff --git a/core/modules/comment/src/Entity/Comment.php b/core/modules/comment/src/Entity/Comment.php
index a244163..d37da4a 100644
--- a/core/modules/comment/src/Entity/Comment.php
+++ b/core/modules/comment/src/Entity/Comment.php
@@ -8,6 +8,7 @@
 use Drupal\comment\CommentInterface;
 use Drupal\Core\Entity\EntityChangedTrait;
 use Drupal\Core\Entity\EntityPublishedTrait;
+use Drupal\Core\Entity\EntityPublishedInterface;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Field\BaseFieldDefinition;
@@ -81,8 +82,12 @@ public function preSave(EntityStorageInterface $storage) {
     parent::preSave($storage);
 
     if (is_null($this->get('status')->value)) {
-      $published = \Drupal::currentUser()->hasPermission('skip comment approval') ? CommentInterface::PUBLISHED : CommentInterface::NOT_PUBLISHED;
-      $this->setPublished($published);
+      if (\Drupal::currentUser()->hasPermission('skip comment approval')) {
+        $this->publish();
+      }
+      else {
+        $this->unpublish();
+      }
     }
     if ($this->isNew()) {
       // Add the comment to database. This next section builds the thread field.
diff --git a/core/modules/node/src/NodeInterface.php b/core/modules/node/src/NodeInterface.php
index 980dacd..0fba8fe 100644
--- a/core/modules/node/src/NodeInterface.php
+++ b/core/modules/node/src/NodeInterface.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\node;
 
+use Drupal\Core\Entity\EntityPublishedInterface;
 use Drupal\Core\Entity\RevisionLogInterface;
 use Drupal\user\EntityOwnerInterface;
 use Drupal\Core\Entity\EntityChangedInterface;
@@ -10,7 +11,7 @@
 /**
  * Provides an interface defining a node entity.
  */
-interface NodeInterface extends ContentEntityInterface, EntityChangedInterface, EntityOwnerInterface, RevisionLogInterface {
+interface NodeInterface extends ContentEntityInterface, EntityChangedInterface, EntityOwnerInterface, RevisionLogInterface, EntityPublishedInterface {
 
   /**
    * Gets the node type.
@@ -97,23 +98,17 @@ public function isSticky();
   public function setSticky($sticky);
 
   /**
-   * Returns the node published status indicator.
-   *
-   * Unpublished nodes are only visible to their authors and to administrators.
-   *
-   * @return bool
-   *   TRUE if the node is published.
-   */
-  public function isPublished();
-
-  /**
-   * Sets the published status of a node..
+   * Sets the published status of a node.
    *
    * @param bool $published
    *   TRUE to set this node to published, FALSE to set it to unpublished.
    *
    * @return \Drupal\node\NodeInterface
    *   The called node entity.
+   *
+   * @deprecated in Drupal 8.3.0, will be removed before Drupal 9.0.0. Use
+   *   \Drupal\Core\Entity\EntityPublishedInterface::publish() and
+   *   \Drupal\Core\Entity\EntityPublishedInterface::unpublish() instead.
    */
   public function setPublished($published);
 
