diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index 2c62589..7d5d669 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -1361,4 +1361,21 @@ public function hasTranslationChanges() {
     return FALSE;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function isLatestRevision() {
+    // New entities or entity types which are not revisionable are always
+    // considered the latest revision.
+    if ($this->isNew() || !$this->getEntityType()->isRevisionable()) {
+      return TRUE;
+    }
+    $storage = $this->entityTypeManager()->getStorage($this->getEntityTypeId());
+    $result = $storage->getQuery()
+      ->latestRevision()
+      ->condition($this->getEntityType()->getKey('id'), $this->id())
+      ->execute();
+    return key($result) == $this->getLoadedRevisionId();
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index dbd3b91..e628e42 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -714,4 +714,15 @@ public function getInstance(array $options) {
     return $this->container->get('entity_type.manager')->getInstance($options);
   }
 
+  /**
+   * {@inheritdoc}
+   *
+   * @deprecated in Drupal 8.0.0, will be removed before Drupal 9.0.0.
+   *   Use \Drupal\Core\Entity\EntityTypeRepositoryInterface::loadLatestEntityRevision()
+   *   instead.
+   */
+  public function loadLatestEntityRevision($entity_type_id, $entity_id) {
+    return $this->container->get('entity_type.repository')->loadLatestEntityRevision($entity_type_id, $entity_id);
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityRepository.php b/core/lib/Drupal/Core/Entity/EntityRepository.php
index 986cc50..4e9ad7f 100644
--- a/core/lib/Drupal/Core/Entity/EntityRepository.php
+++ b/core/lib/Drupal/Core/Entity/EntityRepository.php
@@ -79,6 +79,29 @@ public function loadEntityByConfigTarget($entity_type_id, $target) {
   /**
    * {@inheritdoc}
    */
+  public function loadLatestEntityRevision($entity_type_id, $entity_id) {
+    $storage = $this->entityTypeManager->getStorage($entity_type_id);
+    $definition = $this->entityTypeManager->getDefinition($entity_type_id);
+    if ($definition->isRevisionable()) {
+      $result = $storage->getQuery()
+        ->latestRevision()
+        ->condition($this->entityTypeManager->getDefinition($entity_type_id)->getKey('id'), $entity_id)
+        ->execute();
+      if ($result) {
+        $latest_revision_id = key($result);
+        return $storage->loadRevision($latest_revision_id);
+      }
+    }
+    else {
+      // For non-revisionable entities, the default revision is always the
+      // latest.
+      return $storage->load($entity_id);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getTranslationFromContext(EntityInterface $entity, $langcode = NULL, $context = []) {
     $translation = $entity;
 
diff --git a/core/lib/Drupal/Core/Entity/EntityRepositoryInterface.php b/core/lib/Drupal/Core/Entity/EntityRepositoryInterface.php
index d1229d4..afd80e9 100644
--- a/core/lib/Drupal/Core/Entity/EntityRepositoryInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityRepositoryInterface.php
@@ -69,4 +69,17 @@ public function loadEntityByConfigTarget($entity_type_id, $target);
    */
   public function getTranslationFromContext(EntityInterface $entity, $langcode = NULL, $context = []);
 
+  /**
+   * Loads the latest revision of an entity.
+   *
+   * @param string $entity_type_id
+   *   The entity type ID to load from.
+   * @param string|int $entity_id
+   *   The ID of the entity to load.
+   *
+   * @return \Drupal\Core\Entity\EntityInterface|null
+   *   The entity object, or NULL if there is no entity with the given ID.
+   */
+  public function loadLatestEntityRevision($entity_type_id, $entity_id);
+
 }
diff --git a/core/lib/Drupal/Core/Entity/RevisionableInterface.php b/core/lib/Drupal/Core/Entity/RevisionableInterface.php
index 14690e3..e25bc25 100644
--- a/core/lib/Drupal/Core/Entity/RevisionableInterface.php
+++ b/core/lib/Drupal/Core/Entity/RevisionableInterface.php
@@ -52,6 +52,14 @@ public function getRevisionId();
   public function isDefaultRevision($new_value = NULL);
 
   /**
+   * Checks if this entity is the latest revision.
+   *
+   * @return bool
+   *   TRUE if the entity is the latest revision, FALSE otherwise.
+   */
+  public function isLatestRevision();
+
+  /**
    * Acts on a revision before it gets saved.
    *
    * @param EntityStorageInterface $storage
diff --git a/core/modules/content_moderation/content_moderation.services.yml b/core/modules/content_moderation/content_moderation.services.yml
index 5035b67..269a683 100644
--- a/core/modules/content_moderation/content_moderation.services.yml
+++ b/core/modules/content_moderation/content_moderation.services.yml
@@ -9,7 +9,7 @@ services:
     arguments: ['@content_moderation.moderation_information']
   content_moderation.moderation_information:
     class: Drupal\content_moderation\ModerationInformation
-    arguments: ['@entity_type.manager', '@entity_type.bundle.info']
+    arguments: ['@entity_type.manager', '@entity_type.bundle.info', '@entity.repository']
   access_check.latest_revision:
     class: Drupal\content_moderation\Access\LatestRevisionCheck
     arguments: ['@content_moderation.moderation_information']
diff --git a/core/modules/content_moderation/src/ModerationInformation.php b/core/modules/content_moderation/src/ModerationInformation.php
index 58eaa9f..559a67e 100644
--- a/core/modules/content_moderation/src/ModerationInformation.php
+++ b/core/modules/content_moderation/src/ModerationInformation.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
@@ -29,6 +30,13 @@ class ModerationInformation implements ModerationInformationInterface {
   protected $bundleInfo;
 
   /**
+   * The entity repository.
+   *
+   * @var \Drupal\Core\Entity\EntityRepositoryInterface
+   */
+  protected $entityRepository;
+
+  /**
    * Creates a new ModerationInformation instance.
    *
    * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
@@ -36,8 +44,9 @@ class ModerationInformation implements ModerationInformationInterface {
    * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $bundle_info
    *   The bundle information service.
    */
-  public function __construct(EntityTypeManagerInterface $entity_type_manager, EntityTypeBundleInfoInterface $bundle_info) {
+  public function __construct(EntityTypeManagerInterface $entity_type_manager, EntityTypeBundleInfoInterface $bundle_info, EntityRepositoryInterface $entity_repository) {
     $this->entityTypeManager = $entity_type_manager;
+    $this->entityRepository = $entity_repository;
     $this->bundleInfo = $bundle_info;
   }
 
@@ -74,9 +83,7 @@ public function shouldModerateEntitiesOfBundle(EntityTypeInterface $entity_type,
    * {@inheritdoc}
    */
   public function getLatestRevision($entity_type_id, $entity_id) {
-    if ($latest_revision_id = $this->getLatestRevisionId($entity_type_id, $entity_id)) {
-      return $this->entityTypeManager->getStorage($entity_type_id)->loadRevision($latest_revision_id);
-    }
+    return $this->entityRepository->loadLatestEntityRevision($entity_type_id, $entity_id);
   }
 
   /**
@@ -84,14 +91,12 @@ public function getLatestRevision($entity_type_id, $entity_id) {
    */
   public function getLatestRevisionId($entity_type_id, $entity_id) {
     if ($storage = $this->entityTypeManager->getStorage($entity_type_id)) {
-      $revision_ids = $storage->getQuery()
-        ->allRevisions()
+      $result = $storage->getQuery()
+        ->latestRevision()
         ->condition($this->entityTypeManager->getDefinition($entity_type_id)->getKey('id'), $entity_id)
-        ->sort($this->entityTypeManager->getDefinition($entity_type_id)->getKey('revision'), 'DESC')
-        ->range(0, 1)
         ->execute();
-      if ($revision_ids) {
-        return array_keys($revision_ids)[0];
+      if ($result) {
+        return key($result);
       }
     }
   }
@@ -101,13 +106,12 @@ public function getLatestRevisionId($entity_type_id, $entity_id) {
    */
   public function getDefaultRevisionId($entity_type_id, $entity_id) {
     if ($storage = $this->entityTypeManager->getStorage($entity_type_id)) {
-      $revision_ids = $storage->getQuery()
+      $result = $storage->getQuery()
+        ->currentRevision()
         ->condition($this->entityTypeManager->getDefinition($entity_type_id)->getKey('id'), $entity_id)
-        ->sort($this->entityTypeManager->getDefinition($entity_type_id)->getKey('revision'), 'DESC')
-        ->range(0, 1)
         ->execute();
-      if ($revision_ids) {
-        return array_keys($revision_ids)[0];
+      if ($result) {
+        return key($result);
       }
     }
   }
@@ -135,7 +139,7 @@ public function isPendingRevisionAllowed(ContentEntityInterface $entity) {
    * {@inheritdoc}
    */
   public function isLatestRevision(ContentEntityInterface $entity) {
-    return $entity->getRevisionId() == $this->getLatestRevisionId($entity->getEntityTypeId(), $entity->id());
+    return $entity->isLatestRevision();
   }
 
   /**
diff --git a/core/modules/content_moderation/src/ModerationInformationInterface.php b/core/modules/content_moderation/src/ModerationInformationInterface.php
index 1dafb3f..2b2fcaf 100644
--- a/core/modules/content_moderation/src/ModerationInformationInterface.php
+++ b/core/modules/content_moderation/src/ModerationInformationInterface.php
@@ -58,6 +58,9 @@ public function shouldModerateEntitiesOfBundle(EntityTypeInterface $entity_type,
    * @return \Drupal\Core\Entity\ContentEntityInterface|null
    *   The latest entity revision or NULL, if the entity type / entity doesn't
    *   exist.
+   *
+   * @deprecated as of Drupal 8.5.x, will be removed in Drupal 9.0.0. Instead,
+   *   use \Drupal\Core\Entity\EntityRepository::loadLatestEntityRevision.
    */
   public function getLatestRevision($entity_type_id, $entity_id);
 
@@ -122,6 +125,9 @@ public function isPendingRevisionAllowed(ContentEntityInterface $entity);
    * @return bool
    *   TRUE if the specified object is the latest revision of its entity,
    *   FALSE otherwise.
+   *
+   * @deprecated as of Drupal 8.5.x, will be removed in Drupal 9.0.0. Instead,
+   *   use \Drupal\Core\Entity\RevisionableInterface::isLatestRevision.
    */
   public function isLatestRevision(ContentEntityInterface $entity);
 
diff --git a/core/modules/content_moderation/tests/src/Unit/ModerationInformationTest.php b/core/modules/content_moderation/tests/src/Unit/ModerationInformationTest.php
index 57fe761..8ac0a12 100644
--- a/core/modules/content_moderation/tests/src/Unit/ModerationInformationTest.php
+++ b/core/modules/content_moderation/tests/src/Unit/ModerationInformationTest.php
@@ -5,6 +5,7 @@
 use Drupal\content_moderation\Entity\Handler\ModerationHandler;
 use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Entity\ContentEntityType;
+use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
@@ -41,6 +42,17 @@ protected function getEntityTypeManager() {
   }
 
   /**
+   * Get the Entity Repository.
+   *
+   * @return \Drupal\Core\Entity\EntityRepositoryInterface
+   *   A mock entity repository.
+   */
+  protected function getEntityRepository() {
+    $entity_repository = $this->prophesize(EntityRepositoryInterface::class);
+    return $entity_repository->reveal();
+  }
+
+  /**
    * Sets up content moderation and entity manager mocking.
    *
    * @param string $bundle
@@ -67,7 +79,7 @@ public function setupModerationBundleInfo($bundle, $workflow = NULL) {
    * @covers ::isModeratedEntity
    */
   public function testIsModeratedEntity($workflow, $expected) {
-    $moderation_information = new ModerationInformation($this->getEntityTypeManager(), $this->setupModerationBundleInfo('test_bundle', $workflow));
+    $moderation_information = new ModerationInformation($this->getEntityTypeManager(), $this->setupModerationBundleInfo('test_bundle', $workflow), $this->getEntityRepository());
 
     $entity_type = new ContentEntityType([
       'id' => 'test_entity_type',
@@ -96,7 +108,7 @@ public function testGetWorkflowForEntity($workflow) {
     else {
       $workflow_entity = NULL;
     }
-    $moderation_information = new ModerationInformation($entity_type_manager->reveal(), $this->setupModerationBundleInfo('test_bundle', $workflow));
+    $moderation_information = new ModerationInformation($entity_type_manager->reveal(), $this->setupModerationBundleInfo('test_bundle', $workflow), $this->getEntityRepository());
     $entity = $this->prophesize(ContentEntityInterface::class);
     $entity->getEntityTypeId()->willReturn('test_entity_type');
     $entity->bundle()->willReturn('test_bundle');
@@ -115,7 +127,7 @@ public function testShouldModerateEntities($workflow, $expected) {
       'handlers' => ['moderation' => ModerationHandler::class],
     ]);
 
-    $moderation_information = new ModerationInformation($this->getEntityTypeManager(), $this->setupModerationBundleInfo('test_bundle', $workflow));
+    $moderation_information = new ModerationInformation($this->getEntityTypeManager(), $this->setupModerationBundleInfo('test_bundle', $workflow), $this->getEntityRepository());
 
     $this->assertEquals($expected, $moderation_information->shouldModerateEntitiesOfBundle($entity_type, 'test_bundle'));
   }
diff --git a/core/tests/Drupal/KernelTests/Core/Entity/ContentEntityLatestRevisionTest.php b/core/tests/Drupal/KernelTests/Core/Entity/ContentEntityLatestRevisionTest.php
new file mode 100644
index 0000000..f505388
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/Entity/ContentEntityLatestRevisionTest.php
@@ -0,0 +1,80 @@
+<?php
+
+namespace Drupal\KernelTests\Core\Entity;
+
+use Drupal\entity_test\Entity\EntityTest;
+use Drupal\entity_test\Entity\EntityTestRev;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * @coversDefaultClass \Drupal\Core\Entity\ContentEntityBase
+ *
+ * @group Entity
+ */
+class ContentEntityLatestRevisionTest extends KernelTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['entity_test', 'user'];
+
+  /**
+   * The entity test rev storage.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $entityTestRevStorage;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installEntitySchema('user');
+    $this->installEntitySchema('entity_test_rev');
+    $this->installEntitySchema('entity_test');
+
+    $this->entityTestRevStorage = $this->container->get('entity_type.manager')->getStorage('entity_test_rev');
+  }
+
+  /**
+   * @covers ::isLatestRevision
+   */
+  public function testNonRevisionableEntityType() {
+    // New entities are always the latest revision.
+    $entity = EntityTest::create([]);
+    $this->assertEquals(TRUE, $entity->isLatestRevision());
+
+    // A non-revisionable entity will always be the latest revision.
+    $entity->save();
+    $this->assertEquals(TRUE, $entity->isLatestRevision());
+  }
+
+  /**
+   * @covers ::isLatestRevision
+   */
+  public function testRevisionableEntityType() {
+    // New entities are always the latest revision.
+    $entity = EntityTestRev::create([]);
+    $this->assertEquals(TRUE, $entity->isLatestRevision());
+
+    // A new default revision will be the latest revision.
+    $entity->save();
+    $this->assertEquals(TRUE, $entity->isLatestRevision());
+    $this->assertEquals(1, $entity->getLoadedRevisionId());
+
+    // A second revision will also become the default revision.
+    $entity->setNewRevision(TRUE);
+    $entity->save();
+    $this->assertEquals(TRUE, $entity->isLatestRevision());
+    $this->assertEquals(2, $entity->getLoadedRevisionId());
+
+    $original_revision = $this->entityTestRevStorage->loadRevision(1);
+    $this->assertEquals(1, $original_revision->getLoadedRevisionId());
+    $this->assertEquals(FALSE, $original_revision->isLatestRevision());
+  }
+
+}
diff --git a/core/tests/Drupal/KernelTests/Core/Entity/EntityRepositoryTest.php b/core/tests/Drupal/KernelTests/Core/Entity/EntityRepositoryTest.php
new file mode 100644
index 0000000..7ebb625
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/Entity/EntityRepositoryTest.php
@@ -0,0 +1,114 @@
+<?php
+
+namespace Drupal\KernelTests\Core\Entity;
+
+use Drupal\Component\Plugin\Exception\PluginNotFoundException;
+use Drupal\entity_test\Entity\EntityTest;
+use Drupal\entity_test\Entity\EntityTestRev;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * Tests the Entity Repository.
+ *
+ * @group Entity
+ * @coversDefaultClass \Drupal\Core\Entity\EntityRepository
+ */
+class EntityRepositoryTest extends KernelTestBase {
+
+  /**
+   * Modules to install.
+   *
+   * @var array
+   */
+  protected static $modules = [
+    'entity_test',
+    'user',
+  ];
+
+  /**
+   * The entity repository.
+   *
+   * @var \Drupal\Core\Entity\EntityRepositoryInterface
+   */
+  protected $entityRepository;
+
+  public function setUp() {
+    parent::setUp();
+    $this->installEntitySchema('entity_test');
+    $this->installEntitySchema('entity_test_rev');
+    $this->entityRepository = $this->container->get('entity.repository');
+  }
+
+  /**
+   * @covers ::loadLatestEntityRevision
+   */
+  public function testNoMatchingEntity() {
+    $this->assertEquals(NULL, $this->entityRepository->loadLatestEntityRevision('entity_test_rev', 1));
+  }
+
+  /**
+   * @covers ::loadLatestEntityRevision
+   */
+  public function testNonRevisionableEntityTypeNoMatchingEntity() {
+    $this->assertEquals(NULL, $this->entityRepository->loadLatestEntityRevision('entity_test', 1));
+  }
+
+  /**
+   * @covers ::loadLatestEntityRevision
+   */
+  public function testInvalidEntityType() {
+    $this->setExpectedException(PluginNotFoundException::class, 'The "foo" entity type does not exist.');
+    $this->assertEquals(NULL, $this->entityRepository->loadLatestEntityRevision('foo', 1));
+  }
+
+  /**
+   * @covers ::loadLatestEntityRevision
+   */
+  public function testNonRevisionableEntityType() {
+    $entity = EntityTest::create([]);
+    $entity->save();
+
+    $this->assertEquals(1, $entity->id());
+    $this->assertEquals(1, $this->entityRepository->loadLatestEntityRevision('entity_test', 1)->id());
+  }
+
+  /**
+   * @covers ::loadLatestEntityRevision
+   */
+  public function testMultipleRevisions() {
+    $entity = EntityTestRev::create([
+      'name' => 'Test Entity',
+    ]);
+    $entity->save();
+
+    $this->assertEquals(1, $entity->getLoadedRevisionId());
+    $this->assertEquals(1, $entity->id());
+    $this->assertEquals(1, $this->entityRepository->loadLatestEntityRevision('entity_test_rev', $entity->id())->getLoadedRevisionId());
+
+    $entity->setNewRevision(TRUE);
+    $entity->save();
+
+    $this->assertEquals(1, $entity->id());
+    $this->assertEquals(2, $entity->getLoadedRevisionId());
+    $this->assertEquals(2, $this->entityRepository->loadLatestEntityRevision('entity_test_rev', $entity->id())->getLoadedRevisionId());
+  }
+
+  /**
+   * @covers ::loadLatestEntityRevision
+   */
+  public function testPendingRevision() {
+    $entity = EntityTestRev::create([
+      'name' => 'Test Entity',
+    ]);
+    $entity->save();
+
+    $entity->isDefaultRevision(FALSE);
+    $entity->setNewRevision(TRUE);
+    $entity->save();
+
+    $this->assertEquals(1, $entity->id());
+    $this->assertEquals(2, $entity->getLoadedRevisionId());
+    $this->assertEquals(2, $this->entityRepository->loadLatestEntityRevision('entity_test_rev', $entity->id())->getLoadedRevisionId());
+  }
+
+}
