diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,11 @@
 
 ## version 0
 
+### 0.3 -- 2023-10-09
+
+* Add new functions `copyVar` and `copyVarList`.
+* `newVarList`: Refactoring.
+
 ### 0.2.1 -- 2023-10-09
 
 * Expose the functions `unbind2` and `unbind2List`.
diff --git a/binder.cabal b/binder.cabal
--- a/binder.cabal
+++ b/binder.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               binder
-version:            0.2.1
+version:            0.3
 synopsis:           Variable binding for abstract syntax tree
 description:
     binder is purely functional implementation of Ocaml's
@@ -29,7 +29,7 @@
 source-repository this
     type:     git
     location: https://github.com/ijaketak/binder
-    tag:      v0.2.1
+    tag:      v0.3
 
 common depends
     build-depends:
diff --git a/src/Data/Binder.hs b/src/Data/Binder.hs
--- a/src/Data/Binder.hs
+++ b/src/Data/Binder.hs
@@ -32,6 +32,7 @@
   , nameOf
   , boxVar
   , newVar
+  , copyVar
   , isClosed
   , occur
 -- ** Box
@@ -69,6 +70,7 @@
   , namesOf
   , boxVarList
   , newVarList
+  , copyVarList
 -- * Binder for list
   , BinderList
   , binderList'Names
@@ -164,16 +166,24 @@
 boxVar x = x ^. var'Box
 
 -- | Create a new variable with given name.
-newVar :: forall m a. MonadNumbering m => Text -> (Var m a -> m a) -> m (Var m a)
+newVar :: MonadNumbering m => Text -> (Var m a -> m a) -> m (Var m a)
 newVar name mkFree = do
   i <- numbering
+  buildVar i name mkFree
+
+copyVar :: MonadNumbering m => Var m b -> (Var m a -> m a) -> m (Var m a)
+copyVar x mkFree = buildVar (x ^. var'Key) (x ^. var'Name) mkFree
+
+buildVar :: MonadNumbering m => Numbering m -> Text -> (Var m a -> m a)
+         -> m (Var m a)
+buildVar i name mkFree =
   let x = let b = Box'Env
                 (M.singleton i $ AnyVar x)
                 (Closure $ \env ->
                   let f (AnyOne y) = pure $ unsafeCoerce y
                    in f $ fromJust $ M.lookup i env)
            in Var i $ VarBody name mkFree b
-  return x
+   in return x
 
 
 -- | 'Box' is closed if it exposes no free variables.
@@ -317,7 +327,10 @@
 
 -- | Create new variables with given names.
 newVarList :: MonadNumbering m => [Text] -> (Var m a -> m a) -> m (VarList m a)
-newVarList names mkFree = sequence $ flip fmap names $ \name -> newVar name mkFree
+newVarList names mkFree = flip traverse names $ flip newVar mkFree
+
+copyVarList :: MonadNumbering m => VarList m b -> (Var m a -> m a) -> m (VarList m a)
+copyVarList xs mkFree = flip traverse xs $ flip copyVar mkFree
 
 
 -- | Essentially, @BinderList a m b@ means @[a] -> m b@.
