diff --git a/Database/Persist/Class.hs b/Database/Persist/Class.hs
--- a/Database/Persist/Class.hs
+++ b/Database/Persist/Class.hs
@@ -1,7 +1,8 @@
 module Database.Persist.Class
-    (
+    ( ToBackendKey (..)
+
     -- * PersistStore
-      PersistStore (..)
+    , PersistStore (..)
     , getJust
     , belongsTo
     , belongsToJust
diff --git a/Database/Persist/Class/PersistStore.hs b/Database/Persist/Class/PersistStore.hs
--- a/Database/Persist/Class/PersistStore.hs
+++ b/Database/Persist/Class/PersistStore.hs
@@ -10,6 +10,7 @@
     , getJust
     , belongsTo
     , belongsToJust
+    , ToBackendKey(..)
     ) where
 
 import qualified Prelude
@@ -41,6 +42,21 @@
 liftPersist f = do
     env <- ask
     liftIO $ runReaderT f (persistBackend env)
+
+-- | ToBackendKey converts a 'PersistEntity' 'Key' into a 'BackendKey'
+-- This can be used by each backend to convert between a 'Key' and a plain Haskell type.
+-- For Sql, that is done with 'toSqlKey' and 'fromSqlKey'.
+--
+-- By default, a 'PersistEntity' uses the default 'BackendKey' for its Key
+-- and is an instance of ToBackendKey
+--
+-- A 'Key' that instead uses a custom type will not be an instance of 'ToBackendKey'
+class ( PersistEntity record
+      , PersistEntityBackend record ~ backend
+      , PersistStore backend
+      ) => ToBackendKey backend record where
+    toBackendKey   :: Key record -> BackendKey backend
+    fromBackendKey :: BackendKey backend -> Key record
 
 class
   ( Show (BackendKey backend), Read (BackendKey backend)
diff --git a/Database/Persist/Sql/Class.hs b/Database/Persist/Sql/Class.hs
--- a/Database/Persist/Sql/Class.hs
+++ b/Database/Persist/Sql/Class.hs
@@ -10,7 +10,6 @@
 module Database.Persist.Sql.Class
     ( RawSql (..)
     , PersistFieldSql (..)
-    , IsSqlKey (..)
     ) where
 
 import Control.Applicative ((<$>), (<*>))
@@ -269,10 +268,3 @@
 -- An embedded Entity
 instance (PersistField record, PersistEntity record) => PersistFieldSql (Entity record) where
     sqlType _ = SqlString
-
--- | A class for all numeric SQL keys, for easy conversion to/from Int64 values.
---
--- Since 2.0.2
-class IsSqlKey a where
-    toSqlKey :: Int64 -> a
-    fromSqlKey :: a -> Int64
diff --git a/Database/Persist/Sql/Orphan/PersistStore.hs b/Database/Persist/Sql/Orphan/PersistStore.hs
--- a/Database/Persist/Sql/Orphan/PersistStore.hs
+++ b/Database/Persist/Sql/Orphan/PersistStore.hs
@@ -2,13 +2,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE DefaultSignatures #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
-module Database.Persist.Sql.Orphan.PersistStore (withRawQuery, BackendKey(..)) where
+module Database.Persist.Sql.Orphan.PersistStore
+  ( withRawQuery
+  , BackendKey(..)
+  , toSqlKey
+  , fromSqlKey
+  ) where
 
 import Database.Persist
 import Database.Persist.Sql.Types
 import Database.Persist.Sql.Raw
-import Database.Persist.Sql.Class (IsSqlKey (..))
 import qualified Data.Conduit as C
 import qualified Data.Conduit.List as CL
 import qualified Data.Text as T
@@ -35,9 +41,11 @@
     srcRes <- rawQueryRes sql vals
     liftIO $ with srcRes (C.$$ sink)
 
-instance IsSqlKey (BackendKey SqlBackend) where
-    toSqlKey = SqlBackendKey
-    fromSqlKey = unSqlBackendKey
+toSqlKey :: ToBackendKey SqlBackend record => Int64 -> Key record
+toSqlKey = fromBackendKey . SqlBackendKey
+
+fromSqlKey :: ToBackendKey SqlBackend record => Key record -> Int64
+fromSqlKey = unSqlBackendKey . toBackendKey
 
 instance PersistStore Connection where
     newtype BackendKey Connection = SqlBackendKey { unSqlBackendKey :: Int64 }
diff --git a/persistent.cabal b/persistent.cabal
--- a/persistent.cabal
+++ b/persistent.cabal
@@ -1,5 +1,5 @@
 name:            persistent
-version:         2.0.7.1
+version:         2.0.8
 license:         MIT
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
