diff --git a/CHANGES.md b/CHANGES.md
new file mode 100644
--- /dev/null
+++ b/CHANGES.md
@@ -0,0 +1,3 @@
+## 0.4
+
+- Initial release, splitted of `strict-base-types`
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,28 @@
+Copyright (c) 2020      Oleg Grenrus
+              2013-2014 Simon Meier
+              2006-2008 Roman Leshchinskiy
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. Neither the name of the author nor the names of his contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,3 @@
+#!/usr/bin/env runhaskell
+> import Distribution.Simple
+> main = defaultMain
diff --git a/src/Data/Strict/Lens.hs b/src/Data/Strict/Lens.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Strict/Lens.hs
@@ -0,0 +1,163 @@
+{-# LANGUAGE CPP                   #-}
+{-# LANGUAGE DeriveDataTypeable    #-}
+{-# LANGUAGE DeriveGeneric         #-}
+{-# LANGUAGE FlexibleInstances     #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE StandaloneDeriving    #-}
+{-# LANGUAGE TypeFamilies          #-}
+{-# LANGUAGE UndecidableInstances  #-}
+
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+module Data.Strict.Lens (
+    -- * Tuple
+    -- | See instances, in particular for 'Field1' and 'Field2' type classes.
+    -- * Either
+    _Left, _Right,
+    -- * Maybe
+    _Just, _Nothing,
+    -- * These
+    here, there,
+    _This, _That, _These,
+    ) where
+
+
+import           Control.Applicative (pure, (<$>), (<*>))
+import           Prelude             (Int, flip, ($), (.))
+
+-- Lazy variants
+import qualified Prelude             as L
+import qualified Control.Lens        as L
+
+import           Control.Lens        (Each (..), Field1 (..), Field2 (..),
+                                      Index, Prism, Prism', Swapped (..),
+                                      Traversal, indexed, iso, prism, prism',
+                                      (<&>))
+
+import           Data.Strict         (Either (..), Maybe (..), Pair (..),
+                                      Strict (..), These (..), either, maybe,
+                                      swap, these)
+
+-------------------------------------------------------------------------------
+-- Tuple
+-------------------------------------------------------------------------------
+
+instance L.Strict (a, b) (Pair a b) where
+  strict = iso toStrict toLazy
+
+instance Field1 (Pair a b) (Pair a' b) a a' where
+  _1 k (a :!: b) = indexed k (0 :: Int) a <&> \a' -> (a' :!: b)
+
+instance Field2 (Pair a b) (Pair a b') b b' where
+  _2 k (a :!: b) = indexed k (1 :: Int) b <&> \b' -> (a :!: b')
+
+instance Swapped Pair where
+  swapped = iso swap swap
+
+type instance Index (Pair a b) = Int
+instance (a~a', b~b') => Each (Pair a a') (Pair b b') a b where
+  each f ~(a :!: b) = (:!:) <$> f a <*> f b
+  {-# INLINE each #-}
+
+-------------------------------------------------------------------------------
+-- Either
+-------------------------------------------------------------------------------
+
+instance L.Strict (L.Either a b) (Either a b) where
+  strict = iso toStrict toLazy
+
+instance Swapped Either where
+  swapped = either Right Left `iso` either Right Left
+
+instance (a ~ a', b ~ b') => Each (Either a a') (Either b b') a b where
+  each f (Left x)  = Left <$> f x
+  each f (Right x) = Right <$> f x
+
+-- | Analogous to 'Control.Lens.Prism._Left' in "Control.Lens.Prism".
+_Left :: Prism (Either a c) (Either b c) a b
+_Left = prism Left $ either L.Right (L.Left . Right)
+
+-- | Analogous to 'Control.Lens.Prism._Right' in "Control.Lens.Prism".
+_Right :: Prism (Either c a) (Either c b) a b
+_Right = prism Right $ either (L.Left . Left) L.Right
+
+-------------------------------------------------------------------------------
+-- Maybe
+-------------------------------------------------------------------------------
+
+instance L.Strict (L.Maybe a) (Maybe a) where
+  strict = iso toStrict toLazy
+
+instance Each (Maybe a) (Maybe b) a b
+
+-- | Analogous to 'Control.Lens.Prism._Just' in "Control.Lens.Prism"
+_Just :: Prism (Maybe a) (Maybe b) a b
+_Just = prism Just $ maybe (L.Left Nothing) L.Right
+
+-- | Analogous to 'Control.Lens.Prism._Nothing' in "Control.Lens.Prism"
+_Nothing :: Prism' (Maybe a) ()
+_Nothing = prism' (L.const Nothing) $ maybe (L.Just ()) (L.const L.Nothing)
+
+-------------------------------------------------------------------------------
+-- These
+-------------------------------------------------------------------------------
+
+instance Swapped These where
+    swapped = iso swapThese swapThese
+
+instance (a ~ a', b ~ b') => Each (These a a') (These b b') a b where
+    each f (This a)    = This <$> f a
+    each f (That b)    = This <$> f b
+    each f (These a b) = These <$> f a <*> f b
+
+-- | A 'Control.Lens.Traversal' of the first half of a 'These', suitable for use with "Control.Lens".
+--
+-- >>> over here show (That 1)
+-- That 1
+--
+-- >>> over here show (These 'a' 2)
+-- These "'a'" 2
+--
+here :: Traversal (These a c) (These b c) a b
+here f (This x)    = This <$> f x
+here f (These x y) = flip These y <$> f x
+here _ (That x)    = pure (That x)
+
+-- | A 'Control.Lens.Traversal' of the second half of a 'These', suitable for use with "Control.Lens".
+--
+-- @
+-- 'there' :: 'Control.Lens.Traversal' ('These' t b) ('These' t b) a b
+-- @
+--
+-- >>> over there show (That 1)
+-- That "1"
+--
+-- >>> over there show (These 'a' 2)
+-- These 'a' "2"
+--
+there :: Traversal (These c a) (These c b) a b
+there _ (This x)    = pure (This x)
+there f (These x y) = These x <$> f y
+there f (That x)    = That <$> f x
+
+-- | A 'Control.Lens.Prism'' selecting the 'This' constructor.
+--
+-- /Note:/ cannot change type.
+_This :: Prism' (These a b) a
+_This = prism This (these L.Right (L.Left . That) (\x y -> L.Left $ These x y))
+
+-- | A 'Control.Lens.Prism'' selecting the 'That' constructor.
+--
+-- /Note:/ cannot change type.
+_That :: Prism' (These a b) b
+_That = prism That (these (L.Left . This) L.Right (\x y -> L.Left $ These x y))
+
+-- | A 'Control.Lens.Prism'' selecting the 'These' constructor. 'These' names are ridiculous!
+--
+-- /Note:/ cannot change type.
+_These :: Prism' (These a b) (a, b)
+_These = prism (\(a,b) -> These a b) (these (L.Left . This) (L.Left . That) (\x y -> L.Right (x, y)))
+
+swapThese :: These a b -> These b a
+swapThese (This a)    = That a
+swapThese (That b)    = This b
+swapThese (These a b) = These b a
diff --git a/strict-lens.cabal b/strict-lens.cabal
new file mode 100644
--- /dev/null
+++ b/strict-lens.cabal
@@ -0,0 +1,54 @@
+name:               strict-lens
+version:            0.4
+synopsis:           Lenses for types in strict package
+category:           Data, Lenses
+description:        Lenses for types in strict package.
+license:            BSD3
+license-file:       LICENSE
+author:
+  Roman Leshchinskiy <rl@cse.unsw.edu.au>,
+  Simon Meier <iridcode@gmail.com>
+
+maintainer:         Oleg Grenrus <oleg.grenrus@iki.fi>
+copyright:
+  (c) 2006-2008 by Roman Leshchinskiy
+  (c) 2013-2014 by Simon Meier
+
+homepage:           https://github.com/haskell-strict/strict
+cabal-version:      >=1.10
+build-type:         Simple
+tested-with:
+  GHC ==7.4.2
+   || ==7.6.3
+   || ==7.8.4
+   || ==7.10.3
+   || ==8.0.2
+   || ==8.2.2
+   || ==8.4.4
+   || ==8.6.5
+   || ==8.8.3
+   || ==8.10.1
+
+extra-source-files: CHANGES.md
+
+source-repository head
+  type:     git
+  location: https://github.com/haskell-strict/strict.git
+  subdir:   strict-lens
+
+library
+  default-language: Haskell2010
+  ghc-options:      -Wall -fwarn-incomplete-uni-patterns
+
+  if impl(ghc >=8.0)
+    ghc-options:
+      -Wcompat -Wnoncanonical-monad-instances
+      -Wnoncanonical-monadfail-instances
+
+  build-depends:
+      base    >=4.5    && <5
+    , lens    >=4.19.2 && <4.20
+    , strict  >=0.4    && <0.4.1
+
+  hs-source-dirs:   src
+  exposed-modules:  Data.Strict.Lens
