diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,7 @@
+0.2.2.2
+-------
+* Fixed an issue with `Storable` that was causing crashing for some users.
+
 0.2.2.1
 -------
 * Added support for older GHCs still. `unsafeShiftR` was only added in 7.4.
diff --git a/half.cabal b/half.cabal
--- a/half.cabal
+++ b/half.cabal
@@ -1,6 +1,6 @@
 name:          half
 category:      Numeric
-version:       0.2.2.1
+version:       0.2.2.2
 license:       BSD3
 cabal-version: >= 1.8
 license-file:  LICENSE
diff --git a/src/Numeric/Half.hs b/src/Numeric/Half.hs
--- a/src/Numeric/Half.hs
+++ b/src/Numeric/Half.hs
@@ -22,7 +22,7 @@
 -- CPU as well.
 ----------------------------------------------------------------------------
 
-module Numeric.Half 
+module Numeric.Half
   ( Half(..)
   , isZero
   , fromHalf
@@ -58,12 +58,16 @@
 foreign import ccall unsafe "hs_halfToFloat" fromHalf :: Half -> Float
 -- {-# RULES "fromHalf" realToFrac = fromHalf #-}
 
-newtype {-# CTYPE "unsigned short" #-} Half = Half { getHalf :: CUShort } deriving (Typeable)
+newtype
+#if __GLASGOW_HASKELL__ >= 706
+  {-# CTYPE "unsigned short" #-}
+#endif
+  Half = Half { getHalf :: CUShort } deriving (Typeable)
 
 instance Storable Half where
   sizeOf = sizeOf . getHalf
   alignment = alignment . getHalf
-  peek = peek . castPtr
+  peek p = peek (castPtr p) >>= return . Half
   poke p = poke (castPtr p) . getHalf
 
 instance Show Half where
@@ -168,7 +172,7 @@
 pattern HALF_EPSILON = Half 0x1400  -- 0.00097656
 
 -- | Number of base 10 digits that can be represented without change
-pattern HALF_DIG = 2 
+pattern HALF_DIG = 2
 
 -- Minimum positive integer such that 10 raised to that power is a normalized half
 pattern HALF_MIN_10_EXP = -4
