diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,10 @@
-# optics-extra-0.1 (2019-10-18)
+# optics-extra-0.3 (2020-04-15)
+* `optics-core-0.3` compatible release
+* GHC-8.10 support
+* Use stricter `uncurry'` for better performance
+
+# optics-extra-0.2 (2019-10-18)
+* `optics-core-0.2` compatible release
 * Move `use` from `Optics.View` to `Optics.State` and restrict its type
 * Add `preuse` to `Optics.State`
 * Rename `use`, `uses`, `listening` and `listenings` to reflect the fact that
diff --git a/optics-extra.cabal b/optics-extra.cabal
--- a/optics-extra.cabal
+++ b/optics-extra.cabal
@@ -1,12 +1,12 @@
 name:          optics-extra
-version:       0.2
+version:       0.3
 license:       BSD3
 license-file:  LICENSE
 build-type:    Simple
 cabal-version: 1.24
 maintainer:    optics@well-typed.com
 author:        Andrzej Rybczak
-tested-with:   ghc ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.1, GHCJS ==8.4
+tested-with:   ghc ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.3 || ==8.10.1, GHCJS ==8.4
 synopsis:      Extra utilities and instances for optics-core
 category:      Data, Optics, Lenses
 description:
@@ -37,7 +37,7 @@
                , hashable               >= 1.1.1     && <1.4
                , indexed-profunctors    >= 0.1       && <0.2
                , mtl                    >= 2.2.2     && <2.3
-               , optics-core            >= 0.2       && <0.2.1
+               , optics-core            >= 0.3       && <0.3.1
                , text                   >= 1.2       && <1.3
                , transformers           >= 0.5       && <0.6
                , unordered-containers   >= 0.2.6     && <0.3
diff --git a/src/Data/HashMap/Optics.hs b/src/Data/HashMap/Optics.hs
--- a/src/Data/HashMap/Optics.hs
+++ b/src/Data/HashMap/Optics.hs
@@ -55,7 +55,7 @@
 -- | Construct a hash map from an 'IxFold'.
 --
 -- The construction is left-biased (see 'HashMap.union'), i.e. the first
--- occurences of keys in the fold or traversal order are preferred.
+-- occurrences of keys in the fold or traversal order are preferred.
 --
 -- >>> toMapOf ifolded ["hello", "world"]
 -- fromList [(0,"hello"),(1,"world")]
diff --git a/src/Optics/Cons.hs b/src/Optics/Cons.hs
--- a/src/Optics/Cons.hs
+++ b/src/Optics/Cons.hs
@@ -40,48 +40,49 @@
 import qualified Data.Vector.Unboxed as Unbox
 
 import Optics.Core
+import Optics.Internal.Utils
 
 -- Cons
 
 instance Cons StrictB.ByteString StrictB.ByteString Word8 Word8 where
-  _Cons = prism' (uncurry StrictB.cons) StrictB.uncons
+  _Cons = prism' (uncurry' StrictB.cons) StrictB.uncons
   {-# INLINE _Cons #-}
 
 instance Cons LazyB.ByteString LazyB.ByteString Word8 Word8 where
-  _Cons = prism' (uncurry LazyB.cons) LazyB.uncons
+  _Cons = prism' (uncurry' LazyB.cons) LazyB.uncons
   {-# INLINE _Cons #-}
 
 instance Cons StrictT.Text StrictT.Text Char Char where
-  _Cons = prism' (uncurry StrictT.cons) StrictT.uncons
+  _Cons = prism' (uncurry' StrictT.cons) StrictT.uncons
   {-# INLINE _Cons #-}
 
 instance Cons LazyT.Text LazyT.Text Char Char where
-  _Cons = prism' (uncurry LazyT.cons) LazyT.uncons
+  _Cons = prism' (uncurry' LazyT.cons) LazyT.uncons
   {-# INLINE _Cons #-}
 
 instance Cons (Vector a) (Vector b) a b where
-  _Cons = prism (uncurry Vector.cons) $ \v ->
+  _Cons = prism (uncurry' Vector.cons) $ \v ->
     if Vector.null v
     then Left Vector.empty
     else Right (Vector.unsafeHead v, Vector.unsafeTail v)
   {-# INLINE _Cons #-}
 
 instance (Prim a, Prim b) => Cons (Prim.Vector a) (Prim.Vector b) a b where
-  _Cons = prism (uncurry Prim.cons) $ \v ->
+  _Cons = prism (uncurry' Prim.cons) $ \v ->
     if Prim.null v
     then Left Prim.empty
     else Right (Prim.unsafeHead v, Prim.unsafeTail v)
   {-# INLINE _Cons #-}
 
 instance (Storable a, Storable b) => Cons (Storable.Vector a) (Storable.Vector b) a b where
-  _Cons = prism (uncurry Storable.cons) $ \v ->
+  _Cons = prism (uncurry' Storable.cons) $ \v ->
     if Storable.null v
     then Left Storable.empty
     else Right (Storable.unsafeHead v, Storable.unsafeTail v)
   {-# INLINE _Cons #-}
 
 instance (Unbox a, Unbox b) => Cons (Unbox.Vector a) (Unbox.Vector b) a b where
-  _Cons = prism (uncurry Unbox.cons) $ \v ->
+  _Cons = prism (uncurry' Unbox.cons) $ \v ->
     if Unbox.null v
     then Left Unbox.empty
     else Right (Unbox.unsafeHead v, Unbox.unsafeTail v)
@@ -90,49 +91,49 @@
 -- Snoc
 
 instance Snoc (Vector a) (Vector b) a b where
-  _Snoc = prism (uncurry Vector.snoc) $ \v -> if Vector.null v
+  _Snoc = prism (uncurry' Vector.snoc) $ \v -> if Vector.null v
     then Left Vector.empty
     else Right (Vector.unsafeInit v, Vector.unsafeLast v)
   {-# INLINE _Snoc #-}
 
 instance (Prim a, Prim b) => Snoc (Prim.Vector a) (Prim.Vector b) a b where
-  _Snoc = prism (uncurry Prim.snoc) $ \v -> if Prim.null v
+  _Snoc = prism (uncurry' Prim.snoc) $ \v -> if Prim.null v
     then Left Prim.empty
     else Right (Prim.unsafeInit v, Prim.unsafeLast v)
   {-# INLINE _Snoc #-}
 
 instance (Storable a, Storable b) => Snoc (Storable.Vector a) (Storable.Vector b) a b where
-  _Snoc = prism (uncurry Storable.snoc) $ \v -> if Storable.null v
+  _Snoc = prism (uncurry' Storable.snoc) $ \v -> if Storable.null v
     then Left Storable.empty
     else Right (Storable.unsafeInit v, Storable.unsafeLast v)
   {-# INLINE _Snoc #-}
 
 instance (Unbox a, Unbox b) => Snoc (Unbox.Vector a) (Unbox.Vector b) a b where
-  _Snoc = prism (uncurry Unbox.snoc) $ \v -> if Unbox.null v
+  _Snoc = prism (uncurry' Unbox.snoc) $ \v -> if Unbox.null v
     then Left Unbox.empty
     else Right (Unbox.unsafeInit v, Unbox.unsafeLast v)
   {-# INLINE _Snoc #-}
 
 instance Snoc StrictB.ByteString StrictB.ByteString Word8 Word8 where
-  _Snoc = prism (uncurry StrictB.snoc) $ \v -> if StrictB.null v
+  _Snoc = prism (uncurry' StrictB.snoc) $ \v -> if StrictB.null v
     then Left StrictB.empty
     else Right (StrictB.init v, StrictB.last v)
   {-# INLINE _Snoc #-}
 
 instance Snoc LazyB.ByteString LazyB.ByteString Word8 Word8 where
-  _Snoc = prism (uncurry LazyB.snoc) $ \v -> if LazyB.null v
+  _Snoc = prism (uncurry' LazyB.snoc) $ \v -> if LazyB.null v
     then Left LazyB.empty
     else Right (LazyB.init v, LazyB.last v)
   {-# INLINE _Snoc #-}
 
 instance Snoc StrictT.Text StrictT.Text Char Char where
-  _Snoc = prism (uncurry StrictT.snoc) $ \v -> if StrictT.null v
+  _Snoc = prism (uncurry' StrictT.snoc) $ \v -> if StrictT.null v
     then Left StrictT.empty
     else Right (StrictT.init v, StrictT.last v)
   {-# INLINE _Snoc #-}
 
 instance Snoc LazyT.Text LazyT.Text Char Char where
-  _Snoc = prism (uncurry LazyT.snoc) $ \v -> if LazyT.null v
+  _Snoc = prism (uncurry' LazyT.snoc) $ \v -> if LazyT.null v
     then Left LazyT.empty
     else Right (LazyT.init v, LazyT.last v)
   {-# INLINE _Snoc #-}
diff --git a/src/Optics/Indexed.hs b/src/Optics/Indexed.hs
--- a/src/Optics/Indexed.hs
+++ b/src/Optics/Indexed.hs
@@ -45,6 +45,7 @@
   , FoldableWithIndex (..)
   , itraverse_
   , ifor_
+  , itoList
   -- ** Traversable with index
   , TraversableWithIndex (..)
   , ifor
diff --git a/src/Optics/View.hs b/src/Optics/View.hs
--- a/src/Optics/View.hs
+++ b/src/Optics/View.hs
@@ -4,6 +4,7 @@
 import Control.Monad.Reader.Class
 import Control.Monad.State
 import Control.Monad.Writer
+import Data.Kind
 
 import Optics.Core
 
@@ -26,7 +27,7 @@
 -- mostly useful for things such as 'Optics.Passthrough.passthrough'.
 --
 class ViewableOptic k r where
-  type ViewResult k r :: *
+  type ViewResult k r :: Type
   gview
     :: MonadReader s m
     => Optic' k is s r
