diff --git a/lib/Doctrine/ORM/Cache/DefaultEntityHydrator.php b/lib/Doctrine/ORM/Cache/DefaultEntityHydrator.php
index b5fc84219..9ecb18e92 100644
--- a/lib/Doctrine/ORM/Cache/DefaultEntityHydrator.php
+++ b/lib/Doctrine/ORM/Cache/DefaultEntityHydrator.php
@@ -73,7 +73,7 @@ class DefaultEntityHydrator implements EntityHydrator
     public function buildCacheEntry(ClassMetadata $metadata, EntityCacheKey $key, $entity)
     {
         $data = $this->uow->getOriginalEntityData($entity);
-        $data = array_merge($data, $key->identifier); // why update has no identifier values ?
+        $data = array_merge($data, $metadata->getIdentifierValues($entity)); // why update has no identifier values ?
 
         foreach ($metadata->associationMappings as $name => $assoc) {
             if ( ! isset($data[$name])) {
diff --git a/tests/Doctrine/Tests/ORM/Cache/DefaultEntityHydratorTest.php b/tests/Doctrine/Tests/ORM/Cache/DefaultEntityHydratorTest.php
index d81cade87..73878ee46 100644
--- a/tests/Doctrine/Tests/ORM/Cache/DefaultEntityHydratorTest.php
+++ b/tests/Doctrine/Tests/ORM/Cache/DefaultEntityHydratorTest.php
@@ -119,7 +119,7 @@ class DefaultEntityHydratorTest extends OrmTestCase
         $this->assertArrayHasKey('name', $cache->data);
         $this->assertArrayHasKey('country', $cache->data);
         $this->assertEquals(array(
-            'id'        => 11,
+            'id'        => 12,
             'name'      => 'Bar',
             'country'   => new AssociationCacheEntry(Country::CLASSNAME, array('id' => 11)),
         ), $cache->data);
@@ -147,9 +147,39 @@ class DefaultEntityHydratorTest extends OrmTestCase
         $this->assertArrayHasKey('name', $cache->data);
         $this->assertArrayHasKey('country', $cache->data);
         $this->assertEquals(array(
-            'id'        => 11,
+            'id'        => 12,
             'name'      => 'Bar',
             'country'   => new AssociationCacheEntry(Country::CLASSNAME, array('id' => 11)),
         ), $cache->data);
     }
-}
\ No newline at end of file
+
+    public function testCacheEntryWithWrongIdentifierType()
+    {
+        $proxy          = $this->em->getReference(Country::CLASSNAME, 11);
+        $entity         = new State('Bat', $proxy);
+        $uow            = $this->em->getUnitOfWork();
+        $entityData     = array('id'=> 12, 'name'=>'Bar', 'country' => $proxy);
+        $metadata       = $this->em->getClassMetadata(State::CLASSNAME);
+        $key            = new EntityCacheKey($metadata->name, array('id'=>'12'));
+
+        $entity->setId(12);
+
+        $uow->registerManaged($entity, array('id'=>12), $entityData);
+
+        $cache = $this->structure->buildCacheEntry($metadata, $key, $entity);
+
+        $this->assertInstanceOf('Doctrine\ORM\Cache\CacheEntry', $cache);
+        $this->assertInstanceOf('Doctrine\ORM\Cache\EntityCacheEntry', $cache);
+
+        $this->assertArrayHasKey('id', $cache->data);
+        $this->assertArrayHasKey('name', $cache->data);
+        $this->assertArrayHasKey('country', $cache->data);
+        $this->assertSame($entity->getId(), $cache->data['id']);
+        $this->assertEquals(array(
+            'id'        => 12,
+            'name'      => 'Bar',
+            'country'   => new AssociationCacheEntry(Country::CLASSNAME, array('id' => 11)),
+        ), $cache->data);
+    }
+
+}
diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3967Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3967Test.php
new file mode 100644
index 000000000..d5c3dd554
--- /dev/null
+++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3967Test.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Doctrine\Tests\ORM\Functional\Ticket;
+
+use Doctrine\Tests\Models\Cache\Country;
+use Doctrine\Tests\ORM\Functional\SecondLevelCacheAbstractTest;
+
+class DDC3967Test extends SecondLevelCacheAbstractTest
+{
+    protected function setUp()
+    {
+        parent::setUp();
+
+        $this->loadFixturesCountries();
+        $this->_em->getCache()->evictEntityRegion(Country::CLASSNAME);
+        $this->_em->clear();
+    }
+
+    public function testIdentifierCachedWithProperType()
+    {
+        $country = array_pop($this->countries);
+        $id = $country->getId();
+
+        // First time, loaded from database
+        $this->_em->find(Country::CLASSNAME, "$id");
+        $this->_em->clear();
+
+        // Second time, loaded from cache
+        /** @var Country $country */
+        $country = $this->_em->find(Country::CLASSNAME, "$id");
+
+        // Identifier type should be integer
+        $this->assertSame($country->getId(), $id);
+    }
+}