diff --git a/src/Datasource/DatasourceInterface.php b/src/Datasource/DatasourceInterface.php
index 5cd4ed1..abff9ad 100644
--- a/src/Datasource/DatasourceInterface.php
+++ b/src/Datasource/DatasourceInterface.php
@@ -4,6 +4,7 @@ namespace Drupal\search_api\Datasource;
 
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\TypedData\ComplexDataInterface;
+use Drupal\search_api\Item\Item;
 use Drupal\search_api\Plugin\IndexPluginInterface;
 
 /**
@@ -106,13 +107,13 @@ interface DatasourceInterface extends IndexPluginInterface {
   /**
    * Retrieves the item's language.
    *
-   * @param \Drupal\Core\TypedData\ComplexDataInterface $item
+   * @param \Drupal\search_api\Item\Item $item
    *   An item of this datasource's type.
    *
    * @return string
    *   The language code of this item.
    */
-  public function getItemLanguage(ComplexDataInterface $item);
+  public function getItemLanguage(Item $item);
 
   /**
    * Retrieves a URL at which the item can be viewed on the web.
@@ -129,7 +130,7 @@ interface DatasourceInterface extends IndexPluginInterface {
   /**
    * Checks whether a user has permission to view the given item.
    *
-   * @param \Drupal\Core\TypedData\ComplexDataInterface $item
+   * @param \Drupal\search_api\Item\Item $item
    *   An item of this datasource's type.
    * @param \Drupal\Core\Session\AccountInterface|null $account
    *   (optional) The user session for which to check access, or NULL to check
@@ -138,7 +139,7 @@ interface DatasourceInterface extends IndexPluginInterface {
    * @return bool
    *   TRUE if access is granted, FALSE otherwise.
    */
-  public function checkItemAccess(ComplexDataInterface $item, AccountInterface $account = NULL);
+  public function checkItemAccess(Item $item, AccountInterface $account = NULL);
 
   /**
    * Returns the available view modes for this datasource.
diff --git a/src/Datasource/DatasourcePluginBase.php b/src/Datasource/DatasourcePluginBase.php
index e6cfea0..6372fd9 100644
--- a/src/Datasource/DatasourcePluginBase.php
+++ b/src/Datasource/DatasourcePluginBase.php
@@ -6,6 +6,7 @@ use Drupal\Core\Language\Language;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\TypedData\ComplexDataInterface;
 use Drupal\Core\TypedData\TranslatableInterface;
+use Drupal\search_api\Item\Item;
 use Drupal\search_api\Plugin\IndexPluginBase;
 
 /**
@@ -75,13 +76,14 @@ abstract class DatasourcePluginBase extends IndexPluginBase implements Datasourc
   /**
    * {@inheritdoc}
    */
-  public function getItemLanguage(ComplexDataInterface $item) {
-    if ($item instanceof TranslatableInterface) {
-      return $item->language()->getId();
+  public function getItemLanguage(Item $item) {
+    $object = $item->getOriginalObject();
+    if ($object instanceof TranslatableInterface) {
+      return $object->language()->getId();
     }
-    $item = $item->getValue();
-    if ($item instanceof TranslatableInterface) {
-      return $item->language()->getId();
+    $object = $object->getValue();
+    if ($object instanceof TranslatableInterface) {
+      return $object->language()->getId();
     }
     return Language::LANGCODE_NOT_SPECIFIED;
   }
@@ -96,7 +98,7 @@ abstract class DatasourcePluginBase extends IndexPluginBase implements Datasourc
   /**
    * {@inheritdoc}
    */
-  public function checkItemAccess(ComplexDataInterface $item, AccountInterface $account = NULL) {
+  public function checkItemAccess(Item $item, AccountInterface $account = NULL) {
     return TRUE;
   }
 
diff --git a/src/Item/Item.php b/src/Item/Item.php
index d120b6f..ceff6ec 100644
--- a/src/Item/Item.php
+++ b/src/Item/Item.php
@@ -155,7 +155,7 @@ class Item implements \IteratorAggregate, ItemInterface {
    */
   public function getLanguage() {
     if (!isset($this->language)) {
-      $this->language = $this->getDatasource()->getItemLanguage($this->getOriginalObject());
+      $this->language = $this->getDatasource()->getItemLanguage($this);
     }
     return $this->language;
   }
@@ -408,7 +408,7 @@ class Item implements \IteratorAggregate, ItemInterface {
   public function checkAccess(AccountInterface $account = NULL) {
     try {
       return $this->getDatasource()
-        ->checkItemAccess($this->getOriginalObject(), $account);
+        ->checkItemAccess($this, $account);
     }
     catch (SearchApiException $e) {
       return FALSE;
diff --git a/src/Plugin/search_api/datasource/ContentEntity.php b/src/Plugin/search_api/datasource/ContentEntity.php
index 2feda6c..798e3cd 100644
--- a/src/Plugin/search_api/datasource/ContentEntity.php
+++ b/src/Plugin/search_api/datasource/ContentEntity.php
@@ -23,6 +23,7 @@ use Drupal\field\FieldConfigInterface;
 use Drupal\field\FieldStorageConfigInterface;
 use Drupal\search_api\Datasource\DatasourcePluginBase;
 use Drupal\search_api\Entity\Index;
+use Drupal\search_api\Item\Item;
 use Drupal\search_api\Plugin\PluginFormTrait;
 use Drupal\search_api\IndexInterface;
 use Drupal\search_api\Utility\FieldsHelperInterface;
@@ -608,8 +609,9 @@ class ContentEntity extends DatasourcePluginBase implements EntityDatasourceInte
   /**
    * {@inheritdoc}
    */
-  public function checkItemAccess(ComplexDataInterface $item, AccountInterface $account = NULL) {
-    if ($entity = $this->getEntity($item)) {
+  public function checkItemAccess(Item $item, AccountInterface $account = NULL) {
+    $object = $item->getOriginalObject();
+    if ($entity = $this->getEntity($object)) {
       return $this->getEntityTypeManager()
         ->getAccessControlHandler($this->getEntityTypeId())
         ->access($entity, 'view', $account);
