diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,8 @@
 # avif
 
-# 0.1.2.1
+# 1.0.0.0
 
-  * Remove deprecated function under the hood
+  * Change signature of `decode` and `decodeE` to handle 16-bit images.
 
 # 0.1.2.0
 
diff --git a/avif.cabal b/avif.cabal
--- a/avif.cabal
+++ b/avif.cabal
@@ -1,6 +1,6 @@
 cabal-version:   1.18
 name:            avif
-version:         0.1.2.1
+version:         1.0.0.0
 license:         AGPL-3
 license-file:    LICENSE
 copyright:       Copyright: (c) 2021 Vanessa McHale
diff --git a/src/Codec/Avif.chs b/src/Codec/Avif.chs
--- a/src/Codec/Avif.chs
+++ b/src/Codec/Avif.chs
@@ -2,16 +2,18 @@
                   , decode
                   , decodeE
                   , AvifResult (..)
+                  , RgbImage (..)
                   ) where
 
 import Codec.Avif.FFI
-import Codec.Picture (Image (Image), PixelRGBA8)
+import Codec.Picture (Image (Image), PixelRGBA8, PixelRGBA16)
 import Control.Exception (throw, throwIO)
 import qualified Data.ByteString as BS
 import qualified Data.ByteString.Unsafe as BS
 import Foreign.Ptr (castPtr)
 import Foreign.ForeignPtr (castForeignPtr, newForeignPtr, mallocForeignPtrBytes, withForeignPtr)
-import Foreign.Marshal (allocaBytes, copyBytes)
+import Foreign.Marshal (allocaBytes)
+import Foreign.Marshal.Utils (copyBytes)
 import qualified Data.Vector.Storable as VS
 import System.IO.Unsafe (unsafePerformIO)
 
@@ -54,12 +56,17 @@
     where (Image w h bytes) = img
           (imgPtr, _) = VS.unsafeToForeignPtr0 bytes
 
-decode :: BS.ByteString -> Image PixelRGBA8
+-- | Cf. 'Codec.Picture.DynamicImage'
+--
+-- @since 1.0.0.0
+data RgbImage = ImageRGBA8 (Image PixelRGBA8) | ImageRGBA16 (Image PixelRGBA16)
+
+decode :: BS.ByteString -> RgbImage
 decode = either throw id.decodeE
 
 {-# NOINLINE decodeE #-}
 -- | @since 0.1.2.0
-decodeE :: BS.ByteString -> Either AvifResult (Image PixelRGBA8)
+decodeE :: BS.ByteString -> Either AvifResult RgbImage
 decodeE bs = unsafePerformIO $ BS.unsafeUseAsCStringLen bs $ \(p, sz) -> do
     preDec <- avifDecoderCreate
     dec <- castForeignPtr <$> newForeignPtr avifDecoderDestroy (castPtr preDec)
@@ -84,10 +91,12 @@
 
                 pxPtr <- {# get avifRGBImage->pixels #} rgbImagePtr
 
-                let sz' = w*h*pxSz
+                let sz' = fromIntegral (w*h*pxSz) :: Int
 
-                outBytes <- mallocForeignPtrBytes (fromIntegral sz')
+                outBytes <- mallocForeignPtrBytes sz'
 
                 withForeignPtr outBytes $ \outPtr -> do
-                    copyBytes outPtr (castPtr pxPtr) (fromIntegral sz')
-                    Right (Image (fromIntegral w) (fromIntegral h) (VS.unsafeFromForeignPtr0 outBytes (fromIntegral sz'))) <$ (avifRGBImageFreePixels rgbImagePtr)
+                    copyBytes (castPtr outPtr) (castPtr pxPtr) sz'
+                    let img | pxSz==8 = ImageRGBA16 (Image (fromIntegral w) (fromIntegral h) (VS.unsafeFromForeignPtr0 (castForeignPtr outBytes) sz'))
+                            | pxSz==4 = ImageRGBA8 (Image (fromIntegral w) (fromIntegral h) (VS.unsafeFromForeignPtr0 outBytes sz'))
+                    Right img <$ avifRGBImageFreePixels rgbImagePtr
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -14,6 +14,7 @@
     testGroup "Roundtrip"
         [ decodeNoThrow "test/data/original.avif"
         , decEncNoThrow "test/data/original.avif"
+        -- , decodeRGB16 "test/data/woman.avif"
         , decodeFail
         ]
 
@@ -22,13 +23,23 @@
     let res = decodeE "aaaaa"
     in assertBool "fails on bad input" $ isLeft res
 
+decodeRGB16 :: FilePath -> TestTree
+decodeRGB16 fp = testCase fp $ do
+    res <- decodeE <$> BS.readFile fp
+    case res of
+        Right ImageRGBA16{} -> assertBool "decodes 16-bit" True
+        Right _             -> assertFailure "expected 16-bit color."
+        Left err            -> assertFailure (show err)
+
 decodeNoThrow :: FilePath -> TestTree
 decodeNoThrow fp = testCase fp $ do
-    res <- decode <$> BS.readFile fp
-    assertBool "Doesn't throw exception" (res `deepseq` True)
+    res <- decodeE <$> BS.readFile fp
+    case res of
+        Left err -> assertFailure (show err)
+        Right{}  -> assertBool "Doesn't error" True
 
 decEncNoThrow :: FilePath -> TestTree
 decEncNoThrow fp = testCase fp $ do
     bytes <- BS.readFile fp
-    let res = encode (decode bytes)
+    let res = encode ((\(ImageRGBA8 img) -> img) $ decode bytes)
     assertBool "Doesn't throw exception" (res `deepseq` True)
