diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,11 @@
 # Version history for bin
 
+## 0.1.3
+
+- Add `EqP` and `OrdP` instances.
+- Add `GShow Pos/P` instances.
+- Better 'PosP.toNatural' implementation.
+
 ## 0.1.2
 
 - Add `boring` instances
diff --git a/bin.cabal b/bin.cabal
--- a/bin.cabal
+++ b/bin.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.2
 name:               bin
-version:            0.1.2
+version:            0.1.3
 synopsis:           Bin: binary natural numbers.
 category:           Data, Dependent Types, Singletons, Math
 description:
@@ -41,9 +41,11 @@
    || ==8.4.4
    || ==8.6.5
    || ==8.8.4
-   || ==8.10.4
-   || ==9.0.1
-   || ==9.2.1
+   || ==8.10.7
+   || ==9.0.2
+   || ==9.2.7
+   || ==9.4.4
+   || ==9.6.1
 
 source-repository head
   type:     git
@@ -65,14 +67,14 @@
 
   other-modules:    TrustworthyCompat
   build-depends:
-    , base        >=4.7     && <4.17
+    , base        >=4.7     && <4.19
     , boring      ^>=0.2
     , dec         ^>=0.0.3
     , deepseq     >=1.3.0.2 && <1.5
-    , fin         ^>=0.2
+    , fin         ^>=0.3
     , hashable    >=1.2.7.0 && <1.5
     , QuickCheck  ^>=2.14.2
-    , some        ^>=1.0.3
+    , some        ^>=1.0.4
 
   if !impl(ghc >=7.10)
     build-depends: nats ^>=1.1.2
diff --git a/src/Data/Bin/Pos.hs b/src/Data/Bin/Pos.hs
--- a/src/Data/Bin/Pos.hs
+++ b/src/Data/Bin/Pos.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP                    #-}
 {-# LANGUAGE DataKinds              #-}
 {-# LANGUAGE DeriveDataTypeable     #-}
 {-# LANGUAGE EmptyCase              #-}
@@ -29,15 +30,21 @@
     ) where
 
 import Prelude
-       (Bounded (..), Eq, Int, Integer, Ord (..), Show (..), ShowS, String,
-       fmap, fromIntegral, map, showParen, showString, ($), (.))
+       (Bounded (..), Eq, Int, Integer, Ord (..), Show (..), ShowS, String, fmap, fromIntegral, map, showParen,
+       showString, ($), (.))
 
 import Control.DeepSeq (NFData (..))
 import Data.Bin        (Bin (..), BinP (..))
 import Data.BinP.PosP  (PosP (..))
+import Data.GADT.Show  (GShow (..))
 import Data.Typeable   (Typeable)
 import Numeric.Natural (Natural)
 
+#if MIN_VERSION_some(1,0,5)
+import Data.EqP  (EqP (..))
+import Data.OrdP (OrdP (..))
+#endif
+
 import qualified Data.BinP.PosP  as PP
 import qualified Data.Boring     as Boring
 import qualified Data.Type.Bin   as B
@@ -47,9 +54,12 @@
 import Data.Type.Bin
 
 -- $setup
--- >>> import Prelude (map, putStrLn, Ord (..), Bounded (..), ($), (.))
+-- >>> import Prelude (map, putStrLn, Ord (..), Bounded (..), ($), (.), print)
 -- >>> import Data.Foldable (traverse_)
 -- >>> import Data.Type.Bin
+-- >>> import Data.EqP (eqp)
+-- >>> import Data.OrdP (comparep)
+-- >>> :set -XTypeApplications
 
 -------------------------------------------------------------------------------
 -- Data
@@ -72,6 +82,40 @@
 
 instance Show (Pos b) where
     showsPrec d = showsPrec d . toNatural
+
+-- | @since 0.1.3
+instance GShow Pos where
+    gshowsPrec = showsPrec
+
+#if MIN_VERSION_some(1,0,5)
+-- |
+--
+-- >>> eqp (top :: Pos Bin4) (top :: Pos Bin6)
+-- True
+--
+-- >>> let xs = universe @Bin4; ys = universe @Bin6 in traverse_ print [ [ eqp x y | y <- ys ] | x <- xs ]
+-- [True,False,False,False,False,False]
+-- [False,True,False,False,False,False]
+-- [False,False,True,False,False,False]
+-- [False,False,False,True,False,False]
+--
+-- @since 0.1.3
+instance EqP Pos where
+    eqp (Pos x) (Pos y) = eqp x y
+
+-- |
+--
+-- >>> let xs = universe @Bin4; ys = universe @Bin6 in traverse_ print [ [ comparep x y | y <- ys ] | x <- xs ]
+-- [EQ,LT,LT,LT,LT,LT]
+-- [GT,EQ,LT,LT,LT,LT]
+-- [GT,GT,EQ,LT,LT,LT]
+-- [GT,GT,GT,EQ,LT,LT]
+--
+-- @since 0.1.3
+--
+instance OrdP Pos where
+    comparep (Pos x) (Pos y) = comparep x y
+#endif
 
 -- |
 --
diff --git a/src/Data/BinP/PosP.hs b/src/Data/BinP/PosP.hs
--- a/src/Data/BinP/PosP.hs
+++ b/src/Data/BinP/PosP.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE CPP                    #-}
+{-# LANGUAGE BangPatterns           #-}
 {-# LANGUAGE DataKinds              #-}
 {-# LANGUAGE DeriveDataTypeable     #-}
 {-# LANGUAGE EmptyCase              #-}
@@ -31,18 +33,23 @@
     ) where
 
 import Prelude
-       (Bounded (..), Either (..), Eq, Int, Integer, Num, Ord (..),
-       Ordering (..), Show (..), ShowS, String, either, fmap, fromIntegral, map,
-       showParen, showString, ($), (*), (+), (++), (.))
+       (Bounded (..), Either (..), Eq (..), Int, Integer, Num, Ord (..), Ordering (..), Show (..), ShowS, String, either,
+       fmap, fromIntegral, map, showParen, showString, ($), (*), (+), (++), (.))
 
 import Control.DeepSeq (NFData (..))
 import Data.Bin        (BinP (..))
+import Data.GADT.Show  (GShow (..))
 import Data.Nat        (Nat (..))
 import Data.Proxy      (Proxy (..))
 import Data.Typeable   (Typeable)
 import Data.Wrd        (Wrd (..))
 import Numeric.Natural (Natural)
 
+#if MIN_VERSION_some(1,0,5)
+import Data.EqP  (EqP (..))
+import Data.OrdP (OrdP (..))
+#endif
+
 import qualified Data.Bin        as B
 import qualified Data.Boring     as Boring
 import qualified Data.Type.Bin   as B
@@ -85,6 +92,20 @@
     compare (There0 x) (There0 y) = compare x y
 
 -------------------------------------------------------------------------------
+-- some
+-------------------------------------------------------------------------------
+
+#if MIN_VERSION_some(1,0,5)
+-- | @since 0.1.3
+instance EqP PosP where
+    eqp x y = toNatural x == toNatural y
+
+-- | @since 0.1.3
+instance OrdP PosP where
+    comparep x y = compare (toNatural x) (toNatural y)
+#endif
+
+-------------------------------------------------------------------------------
 -- Instances
 -------------------------------------------------------------------------------
 
@@ -94,6 +115,14 @@
 instance N.SNatI n => Show (PosP' n b) where
     showsPrec d = showsPrec d . toNatural'
 
+-- | @since 0.1.3
+instance GShow PosP where
+    gshowsPrec = showsPrec
+
+-- | @since 0.1.3
+instance N.SNatI n => GShow (PosP' n) where
+    gshowsPrec = showsPrec
+
 instance SBinPI b => Bounded (PosP b) where
     minBound = PosP minBound
     maxBound = PosP maxBound
@@ -201,14 +230,17 @@
 
 -- | Convert 'PosP' to 'Natural'.
 toNatural :: PosP b -> Natural
-toNatural (PosP p) = toNatural' p
+toNatural (PosP p) = toNatural' p -- ' 0 1 p
 
 -- | Convert 'PosP'' to 'Natural'.
 toNatural' :: forall n b. N.SNatI n => PosP' n b -> Natural
-toNatural' (AtEnd v)  = W.toNatural v
-toNatural' (Here v)   = W.toNatural v
-toNatural' (There1 p) = getKNat (exp2 :: KNat Natural n) + toNatural' p
-toNatural' (There0 p) = toNatural' p
+toNatural' = toNatural'' 0 (getKNat (exp2 :: KNat Natural n))
+
+toNatural'' :: Natural -> Natural -> PosP' n b -> Natural
+toNatural'' !acc !_     (AtEnd v)  = acc + W.toNatural v
+toNatural'' !acc !_     (Here v)   = acc + W.toNatural v
+toNatural'' !acc !exp2n (There1 v) = toNatural'' (acc + exp2n) (2 * exp2n) v
+toNatural'' !acc !exp2n (There0 v) = toNatural'' acc           (2 * exp2n) v
 
 exp2 :: Num a => N.SNatI n => KNat a n
 exp2 = N.induction (KNat 1) (\(KNat n) -> KNat (n * 2))
diff --git a/src/Data/Type/Bin.hs b/src/Data/Type/Bin.hs
--- a/src/Data/Type/Bin.hs
+++ b/src/Data/Type/Bin.hs
@@ -63,6 +63,11 @@
 import Data.Typeable     (Typeable)
 import Numeric.Natural   (Natural)
 
+#if MIN_VERSION_some(1,0,5)
+import Data.EqP          (EqP (..))
+import Data.GADT.Compare (defaultEq)
+#endif
+
 import qualified Data.Type.BinP as BP
 import qualified Data.Type.Nat  as N
 import qualified GHC.TypeLits   as GHC
@@ -405,6 +410,19 @@
 -------------------------------------------------------------------------------
 -- some
 -------------------------------------------------------------------------------
+
+-- | @since 0.1.3
+instance Eq (SBin a) where
+    _ == _ = True
+
+-- | @since 0.1.3
+instance Ord (SBin a) where
+    compare _ _ = EQ
+
+#if MIN_VERSION_some(1,0,5)
+-- | @since 0.1.3
+instance EqP SBin where eqp = defaultEq
+#endif
 
 -- | @since 0.1.2
 instance GShow SBin where
diff --git a/src/Data/Type/BinP.hs b/src/Data/Type/BinP.hs
--- a/src/Data/Type/BinP.hs
+++ b/src/Data/Type/BinP.hs
@@ -58,6 +58,11 @@
 import Data.Typeable     (Typeable)
 import Numeric.Natural   (Natural)
 
+#if MIN_VERSION_some(1,0,5)
+import Data.EqP          (EqP (..))
+import Data.GADT.Compare (defaultEq)
+#endif
+
 import qualified Data.Type.Nat as N
 import qualified GHC.TypeLits  as GHC
 
@@ -281,6 +286,19 @@
 -------------------------------------------------------------------------------
 -- some
 -------------------------------------------------------------------------------
+
+-- | @since 0.1.3
+instance Eq (SBinP a) where
+    _ == _ = True
+
+-- | @since 0.1.3
+instance Ord (SBinP a) where
+    compare _ _ = EQ
+
+#if MIN_VERSION_some(1,0,5)
+-- | @since 0.1.3
+instance EqP SBinP where eqp = defaultEq
+#endif
 
 -- | @since 0.1.2
 instance GShow SBinP where
