diff --git a/Foreign/Marshal/StaticArray.hs b/Foreign/Marshal/StaticArray.hs
--- a/Foreign/Marshal/StaticArray.hs
+++ b/Foreign/Marshal/StaticArray.hs
@@ -46,11 +46,11 @@
          -- representation compatible with that of the result array to
          -- avoid that extra copy.
          --
-         -- The following functions provide correct implementations of
-         -- a minimum complete 'Storable' implementation for
-         -- 'StaticArray'. The helper function required by 'peek'' is
-         -- the part necessary for efficient implementations which
-         -- prevent creation of a fully polymorphic instance.
+         -- The following functions provide a minimum complete,
+         -- correct 'Storable' implementation for 'StaticArray'. The
+         -- helper function required by 'peek'' is the part necessary
+         -- for efficient implementations which prevent creation of a
+         -- fully polymorphic instance.
        , sizeOf'
        , alignment'
        , poke'
@@ -101,12 +101,14 @@
 -- elements. This has all the semantic caveats of 'array', except that
 -- the bounds are as good as those provided by the 'StaticSize'
 -- instance.
+{-# INLINEABLE staticArray #-}
 staticArray :: (Ix (Bound d), IArray b e, StaticSize d) =>
                [(Bound d, e)] -> StaticArray b d e
 staticArray ls = let a = StaticArray $ array (extent a) ls in a
 
 -- | Create a new 'StaticArray' from a list of elements in index
 -- order. Implemented in terms of 'listArray'.
+{-# INLINEABLE listStaticArray #-}
 listStaticArray :: (StaticSize d, Ix (Bound d), IArray b e) =>
                    [e] -> StaticArray b d e
 listStaticArray ls = let a = StaticArray $ listArray (extent a) ls in a
@@ -115,17 +117,20 @@
 
 -- | Get the size, in bytes, of the native representation of this
 -- 'StaticArray'.
+{-# INLINEABLE sizeOf' #-}
 sizeOf' :: forall b d e. (StaticSize d, Ix (Bound d), Storable e) =>
            StaticArray b d e -> Int
 sizeOf' a = sizeOf (undefined :: e) * rangeSize (extent a)
 
 -- | Get the alignment, in bytes, of the native representation of this
 -- 'StaticArray'
+{-# INLINEABLE alignment' #-}
 alignment' :: forall b d e. Storable e => StaticArray b d e -> Int
 alignment' _ = alignment (undefined :: e)
 
 -- | Write the contents of this 'StaticArray' to the given location in
 -- memory.
+{-# INLINEABLE poke' #-}
 poke' :: forall b d e. (Ix (Bound d), IArray b e, Storable e) =>
          Ptr (StaticArray b d e) -> StaticArray b d e -> IO ()
 poke' dst' arr = do
@@ -140,6 +145,7 @@
 -- result, then freezes it. The first argument is the
 -- freezing function. Non-copying implementations of 'unsafeFreeze'
 -- are safe as this argument, and preferred.
+{-# INLINEABLE peek' #-}
 peek' :: forall b d e m . (StaticSize d, Ix (Bound d), Storable e,
                            IArray b e, MArray m e IO) =>
          (m (Bound d) e -> IO (b (Bound d) e)) ->
@@ -160,17 +166,25 @@
 instance (StaticSize d, Ix (Bound d), Storable e,
           IArray UArray e, MArray IOUArray e IO) =>
          Storable (StaticArray UArray d e) where
+    {-# INLINEABLE sizeOf#-}
     sizeOf = sizeOf'
+    {-# INLINEABLE alignment #-}
     alignment = alignment'
+    {-# INLINEABLE poke #-}
     poke = poke'
+    {-# INLINEABLE peek #-}
     peek = peek' (unsafeFreeze :: IOUArray (Bound d) e ->
                                   IO (UArray (Bound d) e))
 
 instance (StaticSize d, Ix (Bound d), Storable e) =>
          Storable (StaticArray Array d e) where
+    {-# INLINEABLE sizeOf #-}
     sizeOf = sizeOf'
+    {-# INLINEABLE alignment #-}
     alignment = alignment'
+    {-# INLINEABLE poke #-}
     poke = poke'
+    {-# INLINEABLE peek #-}
     peek = peek' (unsafeFreeze :: IOArray (Bound d) e ->
                                   IO (Array (Bound d) e))
 
@@ -186,6 +200,7 @@
 -- automatically fulfilled for all types of kind 'Nat'. Its explicit
 -- presence in the signature is an artifact of how GHC implements
 -- dictionary passing and type erasure.
+{-# INLINEABLE fromNat #-}
 fromNat :: forall (proxy :: Nat -> *) (n :: Nat). SingI n => proxy n -> Int
 fromNat _ = fromInteger $ fromSing (sing :: Sing n)
 
@@ -201,21 +216,25 @@
 
 instance SingI n => StaticSize ('[n] :: [Nat]) where
     type Bound ('[n]) = Int
+    {-# INLINEABLE extent #-}
     extent _ = (0, fromNat (Proxy :: Proxy n) - 1)
 
 instance (SingI n, StaticSize (n2 ': ns)) =>
           StaticSize ((n ': n2 ': ns) :: [Nat]) where
     type Bound (n ': n2 ': ns) = (Int, Bound (n2 ': ns))
+    {-# INLINEABLE extent #-}
     extent _ = ((0, b0), (fromNat (Proxy :: Proxy n) - 1, bn))
       where
         (b0, bn) = extent (undefined :: StaticArray a (n2 ': ns) b)
 
 instance SingI a => StaticSize (a :: Nat) where
     type Bound a = Int
+    {-# INLINEABLE extent #-}
     extent _ = (0, fromNat (Proxy :: Proxy a) - 1)
 
 instance (SingI a, SingI b) => StaticSize ('(a, b) :: (Nat, Nat)) where
     type Bound '(a, b) = (Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1))
@@ -223,6 +242,7 @@
 instance (SingI a, SingI b, SingI c) =>
          StaticSize ('(a, b, c) :: (Nat, Nat, Nat)) where
     type Bound '(a, b, c) = (Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -231,6 +251,7 @@
 instance (SingI a, SingI b, SingI c, SingI d) =>
          StaticSize ('(a, b, c, d) :: (Nat, Nat, Nat, Nat)) where
     type Bound '(a, b, c, d) = (Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -240,6 +261,7 @@
 instance (SingI a, SingI b, SingI c, SingI d, SingI e) =>
          StaticSize ('(a, b, c, d, e) :: (Nat, Nat, Nat, Nat, Nat)) where
     type Bound '(a, b, c, d, e) = (Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -251,6 +273,7 @@
          StaticSize ('(a, b, c, d, e, f) ::
                      (Nat, Nat, Nat, Nat, Nat, Nat)) where
     type Bound '(a, b, c, d, e, f) = (Int, Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -263,6 +286,7 @@
          StaticSize ('(a, b, c, d, e, f, g) ::
                      (Nat, Nat, Nat, Nat, Nat, Nat, Nat)) where
     type Bound '(a, b, c, d, e, f, g) = (Int, Int, Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -278,6 +302,7 @@
                      (Nat, Nat, Nat, Nat, Nat, Nat, Nat, Nat)) where
     type Bound '(a, b, c, d, e, f, g, h) =
         (Int, Int, Int, Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -294,6 +319,7 @@
                      (Nat, Nat, Nat, Nat, Nat, Nat, Nat, Nat, Nat)) where
     type Bound '(a, b, c, d, e, f, g, h, i) =
         (Int, Int, Int, Int, Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -311,6 +337,7 @@
                      (Nat, Nat, Nat, Nat, Nat, Nat, Nat, Nat, Nat, Nat)) where
     type Bound '(a, b, c, d, e, f, g, h, i, j) =
         (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -330,6 +357,7 @@
       where
     type Bound '(a, b, c, d, e, f, g, h, i, j, k) =
         (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -350,6 +378,7 @@
                       Nat)) where
     type Bound '(a, b, c, d, e, f, g, h, i, j, k, l) =
         (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -371,6 +400,7 @@
                       Nat, Nat)) where
     type Bound '(a, b, c, d, e, f, g, h, i, j, k, l, m) =
         (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
diff --git a/Foreign/Marshal/StaticArray/Unpromoted.hs b/Foreign/Marshal/StaticArray/Unpromoted.hs
--- a/Foreign/Marshal/StaticArray/Unpromoted.hs
+++ b/Foreign/Marshal/StaticArray/Unpromoted.hs
@@ -51,21 +51,23 @@
 -- ('Int',('Int','Int')) 'Int'@ with bounds @((0,(0,0)),(1,(9,24)))@.
 --
 -- Neither promoted lists nor this approach support creating
--- 0-dimensional arrays, because they make no sense with 'Storable'.
+-- 0-dimensional arrays, because they make no sense with
+-- 'Foreign.Storable.Storable'.
 data a :. b
+infixr 3 :.
 
 -- | 'Nil' is the terminator for type-level lists created with ':.'
 data Nil
 
-infixr 3 :.
-
 instance SingI n => StaticSize ((n :: Nat) :. Nil) where
     type Bound (n :. Nil) = Int
+    {-# INLINEABLE extent #-}
     extent _ = (0, fromNat (Proxy :: Proxy n) - 1)
 
 instance (SingI n, StaticSize (n2 :. ns)) =>
           StaticSize ((n :: Nat) :. n2 :. ns) where
     type Bound (n :. n2 :. ns) = (Int, Bound (n2 :. ns))
+    {-# INLINEABLE extent #-}
     extent _ = ((0, b0), (fromNat (Proxy :: Proxy n) - 1, bn))
       where
         (b0, bn) = extent (undefined :: StaticArray a (n2 :. ns) b)
@@ -75,6 +77,7 @@
 data D2 (a :: Nat) (b :: Nat)
 instance (SingI a, SingI b) => StaticSize (D2 a b) where
     type Bound (D2 a b) = (Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1))
@@ -84,6 +87,7 @@
 data D3 (a :: Nat) (b :: Nat) (c :: Nat)
 instance (SingI a, SingI b, SingI c) => StaticSize (D3 a b c) where
     type Bound (D3 a b c) = (Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -94,6 +98,7 @@
 data D4 (a :: Nat) (b :: Nat) (c :: Nat) (d :: Nat)
 instance (SingI a, SingI b, SingI c, SingI d) => StaticSize (D4 a b c d) where
     type Bound (D4 a b c d) = (Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -106,6 +111,7 @@
 instance (SingI a, SingI b, SingI c, SingI d, SingI e) =>
          StaticSize (D5 a b c d e) where
     type Bound (D5 a b c d e) = (Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -119,6 +125,7 @@
 instance (SingI a, SingI b, SingI c, SingI d, SingI e, SingI f) =>
          StaticSize (D6 a b c d e f) where
     type Bound (D6 a b c d e f) = (Int, Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -134,6 +141,7 @@
 instance (SingI a, SingI b, SingI c, SingI d, SingI e, SingI f, SingI g) =>
          StaticSize (D7 a b c d e f g) where
     type Bound (D7 a b c d e f g) = (Int, Int, Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -151,6 +159,7 @@
           SingI h) =>
          StaticSize (D8 a b c d e f g h) where
     type Bound (D8 a b c d e f g h) = (Int, Int, Int, Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -170,6 +179,7 @@
          StaticSize (D9 a b c d e f g h i) where
     type Bound (D9 a b c d e f g h i) =
         (Int, Int, Int, Int, Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -190,6 +200,7 @@
          StaticSize (D10 a b c d e f g h i j) where
     type Bound (D10 a b c d e f g h i j) =
         (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -211,6 +222,7 @@
          StaticSize (D11 a b c d e f g h i j k) where
     type Bound (D11 a b c d e f g h i j k) =
         (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -233,6 +245,7 @@
          StaticSize (D12 a b c d e f g h i j k l) where
     type Bound (D12 a b c d e f g h i j k l) =
         (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
@@ -257,6 +270,7 @@
          StaticSize (D13 a b c d e f g h i j k l m) where
     type Bound (D13 a b c d e f g h i j k l m) =
         (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)
+    {-# INLINEABLE extent #-}
     extent _ = ((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
                 (fromNat (Proxy :: Proxy a) - 1,
                  fromNat (Proxy :: Proxy b) - 1,
diff --git a/storable-static-array.cabal b/storable-static-array.cabal
--- a/storable-static-array.cabal
+++ b/storable-static-array.cabal
@@ -1,5 +1,5 @@
 name:                storable-static-array
-version:             0.5.0.0
+version:             0.5.0.1
 synopsis:            Statically-sized array wrappers with Storable instances
                      for FFI marshaling
 description:         Uses type-level numeric literals to wrap arrays in a type
@@ -23,4 +23,4 @@
   exposed-modules:   Foreign.Marshal.StaticArray,
                      Foreign.Marshal.StaticArray.Unpromoted
   build-depends:     base ==4.6.*, array ==0.4.*, tagged ==0.6.*
-  ghc-options:       -Wall
+  ghc-options:       -Wall -O2
