diff --git a/Control/Monad/Primitive.hs b/Control/Monad/Primitive.hs
--- a/Control/Monad/Primitive.hs
+++ b/Control/Monad/Primitive.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE MagicHash, UnboxedTuples, TypeFamilies #-}
+{-# LANGUAGE CPP, MagicHash, UnboxedTuples, TypeFamilies #-}
 
 -- |
 -- Module      : Control.Monad.Primitive
diff --git a/Data/Primitive/Array.hs b/Data/Primitive/Array.hs
--- a/Data/Primitive/Array.hs
+++ b/Data/Primitive/Array.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE MagicHash, UnboxedTuples, DeriveDataTypeable, BangPatterns #-}
+{-# LANGUAGE CPP, MagicHash, UnboxedTuples, DeriveDataTypeable, BangPatterns #-}
 
 -- |
 -- Module      : Data.Primitive.Array
diff --git a/Data/Primitive/ByteArray.hs b/Data/Primitive/ByteArray.hs
--- a/Data/Primitive/ByteArray.hs
+++ b/Data/Primitive/ByteArray.hs
@@ -1,5 +1,4 @@
-{-# LANGUAGE MagicHash, UnboxedTuples, ForeignFunctionInterface,
-             UnliftedFFITypes, DeriveDataTypeable #-}
+{-# LANGUAGE CPP, MagicHash, UnboxedTuples, UnliftedFFITypes, DeriveDataTypeable #-}
 
 -- |
 -- Module      : Data.Primitive.ByteArray
@@ -151,8 +150,8 @@
   = primitive_ (writeByteArray# arr# i# x)
 
 #if __GLASGOW_HASKELL__ >= 702
-i# :: Int -> Int#
-i# (I# n#) = n#
+unI# :: Int -> Int#
+unI# (I# n#) = n#
 #endif
 
 -- | Copy a slice of an immutable byte array to a mutable byte array.
@@ -167,7 +166,7 @@
 {-# INLINE copyByteArray #-}
 copyByteArray (MutableByteArray dst#) doff (ByteArray src#) soff sz
 #if __GLASGOW_HASKELL__ >= 702
-  = primitive_ (copyByteArray# src# (i# soff) dst# (i# doff) (i# sz))
+  = primitive_ (copyByteArray# src# (unI# soff) dst# (unI# doff) (unI# sz))
 #else
   = unsafePrimToPrim
   $ memcpy_ba dst# (fromIntegral doff) src# (fromIntegral soff)
@@ -189,7 +188,7 @@
 copyMutableByteArray (MutableByteArray dst#) doff
                      (MutableByteArray src#) soff sz
 #if __GLASGOW_HASKELL__ >= 702
-  = primitive_ (copyMutableByteArray# src# (i# soff) dst# (i# doff) (i# sz))
+  = primitive_ (copyMutableByteArray# src# (unI# soff) dst# (unI# doff) (unI# sz))
 #else
   = unsafePrimToPrim
   $ memcpy_mba dst# (fromIntegral doff) src# (fromIntegral soff)
@@ -237,8 +236,7 @@
 {-# INLINE fillByteArray #-}
 fillByteArray = setByteArray
 
-
-
+#if __GLASGOW_HASKELL__ < 702
 foreign import ccall unsafe "primitive-memops.h hsprimitive_memcpy"
   memcpy_mba :: MutableByteArray# s -> CInt
              -> MutableByteArray# s -> CInt
@@ -248,6 +246,7 @@
   memcpy_ba :: MutableByteArray# s -> CInt
             -> ByteArray# -> CInt
             -> CSize -> IO ()
+#endif
 
 foreign import ccall unsafe "primitive-memops.h hsprimitive_memmove"
   memmove_mba :: MutableByteArray# s -> CInt
diff --git a/Data/Primitive/Internal/Compat.hs b/Data/Primitive/Internal/Compat.hs
--- a/Data/Primitive/Internal/Compat.hs
+++ b/Data/Primitive/Internal/Compat.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE CPP, MagicHash #-}
 
 -- |
 -- Module      : Data.Primitive.Internal.Compat
diff --git a/Data/Primitive/Internal/Operations.hs b/Data/Primitive/Internal/Operations.hs
--- a/Data/Primitive/Internal/Operations.hs
+++ b/Data/Primitive/Internal/Operations.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE MagicHash, ForeignFunctionInterface, UnliftedFFITypes #-}
+{-# LANGUAGE MagicHash, UnliftedFFITypes #-}
 
 -- |
 -- Module      : Data.Primitive.Internal.Operations
diff --git a/Data/Primitive/MachDeps.hs b/Data/Primitive/MachDeps.hs
--- a/Data/Primitive/MachDeps.hs
+++ b/Data/Primitive/MachDeps.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE CPP, MagicHash #-}
 -- |
 -- Module      : Data.Primitive.MachDeps
 -- Copyright   : (c) Roman Leshchinskiy 2009-2012
diff --git a/Data/Primitive/MutVar.hs b/Data/Primitive/MutVar.hs
--- a/Data/Primitive/MutVar.hs
+++ b/Data/Primitive/MutVar.hs
@@ -19,7 +19,9 @@
   writeMutVar,
 
   atomicModifyMutVar,
-  modifyMutVar
+  atomicModifyMutVar',
+  modifyMutVar,
+  modifyMutVar'
 ) where
 
 import Control.Monad.Primitive ( PrimMonad(..), primitive_ )
@@ -58,9 +60,27 @@
 {-# INLINE atomicModifyMutVar #-}
 atomicModifyMutVar (MutVar mv#) f = primitive $ atomicModifyMutVar# mv# f
 
+-- | Strict version of 'atomicModifyMutVar'. This forces both the value stored
+-- in the 'MutVar' as well as the value returned.
+atomicModifyMutVar' :: PrimMonad m => MutVar (PrimState m) a -> (a -> (a, b)) -> m b
+{-# INLINE atomicModifyMutVar' #-}
+atomicModifyMutVar' mv f = do
+  b <- atomicModifyMutVar mv force
+  b `seq` return b
+  where
+    force x = let (a, b) = f x in (a, a `seq` b)
+
 -- | Mutate the contents of a 'MutVar'
 modifyMutVar :: PrimMonad m => MutVar (PrimState m) a -> (a -> a) -> m ()
 {-# INLINE modifyMutVar #-}
 modifyMutVar (MutVar mv#) g = primitive_ $ \s# ->
   case readMutVar# mv# s# of
     (# s'#, a #) -> writeMutVar# mv# (g a) s'#
+
+-- | Strict version of 'modifyMutVar'
+modifyMutVar' :: PrimMonad m => MutVar (PrimState m) a -> (a -> a) -> m ()
+{-# INLINE modifyMutVar' #-}
+modifyMutVar' (MutVar mv#) g = primitive_ $ \s# ->
+  case readMutVar# mv# s# of
+    (# s'#, a #) -> let a' = g a in a' `seq` writeMutVar# mv# a' s'#
+
diff --git a/Data/Primitive/Types.hs b/Data/Primitive/Types.hs
--- a/Data/Primitive/Types.hs
+++ b/Data/Primitive/Types.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE UnboxedTuples, MagicHash, DeriveDataTypeable #-}
+{-# LANGUAGE CPP, UnboxedTuples, MagicHash, DeriveDataTypeable #-}
 
 -- |
 -- Module      : Data.Primitive.Types
@@ -22,7 +22,6 @@
 import Data.Primitive.Internal.Operations
 
 import GHC.Base (
-    unsafeCoerce#,
     Int(..), Char(..),
   )
 import GHC.Float (
@@ -114,16 +113,16 @@
                         { (# s1#, x# #) -> (# s1#, ctr x# #) }  \
 ; writeByteArray# arr# i# (ctr x#) s# = wr_arr arr# i# x# s#    \
 ; setByteArray# arr# i# n# (ctr x#) s#                          \
-    = case internal (set_arr arr# i# n# x#) (unsafeCoerce# s#) of \
-        { (# s1#, _ #) -> unsafeCoerce# s1# }                   \
+    = case unsafeCoerce# (internal (set_arr arr# i# n# x#)) s# of \
+        { (# s1#, _ #) -> s1# }                                 \
                                                                 \
 ; indexOffAddr# addr# i# = ctr (idx_addr addr# i#)              \
 ; readOffAddr#  addr# i# s# = case rd_addr addr# i# s# of       \
                         { (# s1#, x# #) -> (# s1#, ctr x# #) }  \
 ; writeOffAddr# addr# i# (ctr x#) s# = wr_addr addr# i# x# s#   \
 ; setOffAddr# addr# i# n# (ctr x#) s#                           \
-    = case internal (set_addr addr# i# n# x#) (unsafeCoerce# s#) of \
-        { (# s1#, _ #) -> unsafeCoerce# s1# }                   \
+    = case unsafeCoerce# (internal (set_addr addr# i# n# x#)) s# of \
+        { (# s1#, _ #) -> s1# }                                 \
 ; {-# INLINE sizeOf# #-}                                        \
 ; {-# INLINE alignment# #-}                                     \
 ; {-# INLINE indexByteArray# #-}                                \
diff --git a/cbits/primitive-memops.c b/cbits/primitive-memops.c
--- a/cbits/primitive-memops.c
+++ b/cbits/primitive-memops.c
@@ -19,7 +19,7 @@
     memset(p, 0, n * sizeof(Hs ## TYPE));                                    \
   else if (sizeof(Hs ## TYPE) == sizeof(int)*2) {                            \
     int *q = (int *)p;                                                       \
-    const int *r = (const int *)&x;                                          \
+    const int *r = (const int *)(void *)&x;                                  \
     while (n>0) {                                                            \
       q[0] = r[0];                                                           \
       q[1] = r[1];                                                           \
@@ -49,4 +49,3 @@
 MEMSET(Float, HsFloat)
 MEMSET(Double, HsDouble)
 MEMSET(Char, HsChar)
-
diff --git a/changelog b/changelog
new file mode 100644
--- /dev/null
+++ b/changelog
@@ -0,0 +1,41 @@
+Changes in version 0.5.2.0
+
+ * Add strict variants of 'MutVar' modification functions
+
+Changes in version 0.5.1.0
+
+ * Add support for GHC 7.7's new primitive 'Bool' representation
+
+Changes in version 0.5.0.1
+
+ * Disable array copying primitives for GHC 7.6.* and earlier
+
+Changes in version 0.5
+
+ * New in "Data.Primitive.MutVar": 'atomicModifyMutVar'
+
+ * Efficient block fill operations: 'setByteArray', 'setAddr'
+
+Changes in version 0.4.1
+
+ * New module "Data.Primitive.MutVar"
+
+Changes in version 0.4.0.1
+
+ * Critical bug fix in 'fillByteArray'
+
+Changes in version 0.4
+
+ * Support for GHC 7.2 array copying primitives
+
+ * New in "Data.Primitive.ByteArray": 'copyByteArray',
+   'copyMutableByteArray', 'moveByteArray', 'fillByteArray'
+
+ * Deprecated in "Data.Primitive.ByteArray": 'memcpyByteArray',
+   'memcpyByteArray'', 'memmoveByteArray', 'memsetByteArray'
+
+ * New in "Data.Primitive.Array": 'copyArray', 'copyMutableByteArray'
+
+ * New in "Data.Primitive.Addr": 'copyAddr', 'moveAddr'
+
+ * Deprecated in "Data.Primitive.Addr": 'memcpyAddr'
diff --git a/primitive.cabal b/primitive.cabal
--- a/primitive.cabal
+++ b/primitive.cabal
@@ -1,7 +1,8 @@
 Name:           primitive
-Version:        0.5.1.0
+Version:        0.5.2.1
 License:        BSD3
 License-File:   LICENSE
+
 Author:         Roman Leshchinskiy <rl@cse.unsw.edu.au>
 Maintainer:     Roman Leshchinskiy <rl@cse.unsw.edu.au>
 Copyright:      (c) Roman Leshchinskiy 2009-2012
@@ -9,26 +10,18 @@
 Bug-Reports:    https://github.com/haskell/primitive/issues
 Category:       Data
 Synopsis:       Primitive memory-related operations
-Description:
-        .
-        This package provides various primitive memory-related operations.
-        .
-        Changes in version 0.5.0.1
-        .
-        * Disable array copying primitives for GHC 7.6.* and earlier
-        .
-        Changes in version 0.5
-        .
-        * New in "Data.Primitive.MutVar": @atomicModifyMutVar@
-        .
-        * Efficient block fill operations: @setByteArray@, @setAddr@
-        .
-
-Cabal-Version:  >= 1.6
+Cabal-Version:  >= 1.10
 Build-Type:     Simple
+Description:    This package provides various primitive memory-related operations.
 
+Extra-Source-Files: changelog
+
 Library
-  Extensions: CPP
+  Default-Language: Haskell2010
+  Other-Extensions:
+        BangPatterns, CPP, DeriveDataTypeable,
+        MagicHash, TypeFamilies, UnboxedTuples, UnliftedFFITypes
+
   Exposed-Modules:
         Control.Monad.Primitive
         Data.Primitive
@@ -43,18 +36,19 @@
         Data.Primitive.Internal.Compat
         Data.Primitive.Internal.Operations
 
-  Build-Depends: base >= 4 && < 5, ghc-prim
+  Build-Depends: base >= 4.3 && < 4.8, ghc-prim >= 0.2 && < 0.4
 
-  Ghc-Options: -O2
+  Ghc-Options: -O2 -Wall
 
   Include-Dirs: cbits
   Install-Includes: primitive-memops.h
   includes: primitive-memops.h
   c-sources: cbits/primitive-memops.c
-  cc-options: -O3 -ftree-vectorize -fomit-frame-pointer
-  if arch(i386) || arch(x86_64) {
-    cc-options: -msse2
-  }
+  cc-options: -O3 -fomit-frame-pointer -Wall
+  if !os(solaris)
+      cc-options: -ftree-vectorize
+  if arch(i386) || arch(x86_64)
+      cc-options: -msse2
 
 source-repository head
   type:     git
