diff --git a/language-lua.cabal b/language-lua.cabal
--- a/language-lua.cabal
+++ b/language-lua.cabal
@@ -2,9 +2,14 @@
 Description:         Lua 5.2 lexer, parser and pretty-printer. Documentation: (<https://osa1.github.com/language-lua>)
                      .
                      Changelog:
+                     \0.4.3:
+                     .
+                     - `Data` and `Typeable` instances are implemented for syntax tree.
+                     .
                      \0.4.2:
                      .
                      - More tweaks in pretty printer.
+                     .
                      - Started using 2 spaces for indentation(instead of 4 as before).
                      .
                      \0.4.1:
@@ -34,7 +39,7 @@
                      \0.2.0:
                      .
                      - Syntax tree is annotated. All parsers(`parseText`, `parseFile`) annotate resulting tree with source positions.
-Version:             0.4.2
+Version:             0.4.3
 Synopsis:            Lua parser and pretty-printer
 Homepage:            http://github.com/osa1/language-lua
 Bug-reports:         http://github.com/osa1/language-lua/issues
diff --git a/src/Language/Lua/Annotated/Syntax.hs b/src/Language/Lua/Annotated/Syntax.hs
--- a/src/Language/Lua/Annotated/Syntax.hs
+++ b/src/Language/Lua/Annotated/Syntax.hs
@@ -1,12 +1,14 @@
 {-# LANGUAGE DeriveFunctor #-}
+{-# LANGUAGE DeriveDataTypeable #-}
 
 -- | Lua 5.2 syntax tree, as specified in <http://www.lua.org/manual/5.2/manual.html#9>.
 -- Annotation implementation is inspired by haskell-src-exts.
 module Language.Lua.Annotated.Syntax where
 
 import Prelude hiding (LT, EQ, GT)
+import Data.Data
 
-data Name a = Name a String deriving (Show, Eq, Functor)
+data Name a = Name a String deriving (Show, Eq, Functor, Data, Typeable)
 
 data Stat a
     = Assign a [Var a] [Exp a] -- ^var1, var2 .. = exp1, exp2 ..
@@ -24,7 +26,7 @@
     | LocalFunAssign a (Name a) (FunBody a) -- ^local function \<var\> (..) .. end
     | LocalAssign a [Name a] (Maybe [Exp a]) -- ^local var1, var2 .. = exp1, exp2 ..
     | EmptyStat a -- ^/;/
-    deriving (Show, Eq, Functor)
+    deriving (Show, Eq, Functor, Data, Typeable)
 
 data Exp a
     = Nil a
@@ -37,59 +39,59 @@
     | TableConst a (Table a) -- ^table constructor
     | Binop a (Binop a) (Exp a) (Exp a) -- ^binary operators, /+ - * ^ % .. < <= > >= == ~= and or/
     | Unop a (Unop a) (Exp a) -- ^unary operators, /- not #/
-    deriving (Show, Eq, Functor)
+    deriving (Show, Eq, Functor, Data, Typeable)
 
 data Var a
     = VarName a (Name a) -- ^variable
     | Select a (PrefixExp a) (Exp a) -- ^/table[exp]/
     | SelectName a (PrefixExp a) (Name a) -- ^/table.variable/
-    deriving (Show, Eq, Functor)
+    deriving (Show, Eq, Functor, Data, Typeable)
 
 data Binop a = Add a | Sub a | Mul a | Div a | Exp a | Mod a | Concat a
     | LT a | LTE a | GT a | GTE a | EQ a | NEQ a | And a | Or a
-    deriving (Show, Eq, Functor)
+    deriving (Show, Eq, Functor, Data, Typeable)
 
 data Unop a = Neg a | Not a | Len a
-    deriving (Show, Eq, Functor)
+    deriving (Show, Eq, Functor, Data, Typeable)
 
 data PrefixExp a
     = PEVar a (Var a)
     | PEFunCall a (FunCall a)
     | Paren a (Exp a)
-    deriving (Show, Eq, Functor)
+    deriving (Show, Eq, Functor, Data, Typeable)
 
 data Table a = Table a [TableField a] -- ^list of table fields
-    deriving (Show, Eq, Functor)
+    deriving (Show, Eq, Functor, Data, Typeable)
 
 data TableField a
     = ExpField a (Exp a) (Exp a) -- ^/[exp] = exp/
     | NamedField a (Name a) (Exp a) -- ^/name = exp/
     | Field a (Exp a)
-    deriving (Show, Eq, Functor)
+    deriving (Show, Eq, Functor, Data, Typeable)
 
 -- | A block is list of statements with optional return statement.
 data Block a = Block a [Stat a] (Maybe [Exp a])
-    deriving (Show, Eq, Functor)
+    deriving (Show, Eq, Functor, Data, Typeable)
 
 data FunName a = FunName a (Name a) [Name a] (Maybe (Name a))
-    deriving (Show, Eq, Functor)
+    deriving (Show, Eq, Functor, Data, Typeable)
 
 data FunDef a = FunDef a (FunBody a)
-    deriving (Show, Eq, Functor)
+    deriving (Show, Eq, Functor, Data, Typeable)
 
 data FunBody a = FunBody a [Name a] (Maybe a) (Block a) -- ^(args, vararg, block)
-    deriving (Show, Eq, Functor)
+    deriving (Show, Eq, Functor, Data, Typeable)
 
 data FunCall a
     = NormalFunCall a (PrefixExp a) (FunArg a) -- ^/prefixexp ( funarg )/
     | MethodCall a (PrefixExp a) (Name a) (FunArg a) -- ^/prefixexp : name ( funarg )/
-    deriving (Show, Eq, Functor)
+    deriving (Show, Eq, Functor, Data, Typeable)
 
 data FunArg a
     = Args a [Exp a] -- ^list of args
     | TableArg a (Table a) -- ^table constructor
     | StringArg a String -- ^string
-    deriving (Show, Eq, Functor)
+    deriving (Show, Eq, Functor, Data, Typeable)
 
 
 class Functor ast => Annotated ast where
diff --git a/src/Language/Lua/Syntax.hs b/src/Language/Lua/Syntax.hs
--- a/src/Language/Lua/Syntax.hs
+++ b/src/Language/Lua/Syntax.hs
@@ -1,9 +1,11 @@
 {-# OPTIONS_GHC -Wall #-}
+{-# LANGUAGE DeriveDataTypeable #-}
 
 -- | Lua 5.2 syntax tree, as specified in <http://www.lua.org/manual/5.2/manual.html#9>.
 module Language.Lua.Syntax where
 
 import Prelude hiding (LT, EQ, GT)
+import Data.Data
 
 type Name = String
 
@@ -23,7 +25,7 @@
     | LocalFunAssign Name FunBody -- ^local function \<var\> (..) .. end
     | LocalAssign [Name] (Maybe [Exp]) -- ^local var1, var2 .. = exp1, exp2 ..
     | EmptyStat -- ^/;/
-    deriving (Show, Eq)
+    deriving (Show, Eq, Data, Typeable)
 
 data Exp
     = Nil
@@ -36,50 +38,50 @@
     | TableConst [TableField] -- ^table constructor
     | Binop Binop Exp Exp -- ^binary operators, /+ - * ^ % .. < <= > >= == ~= and or/
     | Unop Unop Exp -- ^unary operators, /- not #/
-    deriving (Show, Eq)
+    deriving (Show, Eq, Data, Typeable)
 
 data Var
     = VarName Name -- ^variable
     | Select PrefixExp Exp -- ^/table[exp]/
     | SelectName PrefixExp Name -- ^/table.variable/
-    deriving (Show, Eq)
+    deriving (Show, Eq, Data, Typeable)
 
 data Binop = Add | Sub | Mul | Div | Exp | Mod | Concat
     | LT | LTE | GT | GTE | EQ | NEQ | And | Or
-    deriving (Show, Eq)
+    deriving (Show, Eq, Data, Typeable)
 
 data Unop = Neg | Not | Len
-    deriving (Show, Eq)
+    deriving (Show, Eq, Data, Typeable)
 
 data PrefixExp
     = PEVar Var
     | PEFunCall FunCall
     | Paren Exp
-    deriving (Show, Eq)
+    deriving (Show, Eq, Data, Typeable)
 
 data TableField
     = ExpField Exp Exp -- ^/[exp] = exp/
     | NamedField Name Exp -- ^/name = exp/
     | Field Exp
-    deriving (Show, Eq)
+    deriving (Show, Eq, Data, Typeable)
 
 -- | A block is list of statements with optional return statement.
 data Block = Block [Stat] (Maybe [Exp])
-    deriving (Show, Eq)
+    deriving (Show, Eq, Data, Typeable)
 
 data FunName = FunName Name [Name] (Maybe Name)
-    deriving (Show, Eq)
+    deriving (Show, Eq, Data, Typeable)
 
 data FunBody = FunBody [Name] Bool Block -- ^(args, vararg, block)
-    deriving (Show, Eq)
+    deriving (Show, Eq, Data, Typeable)
 
 data FunCall
     = NormalFunCall PrefixExp FunArg -- ^/prefixexp ( funarg )/
     | MethodCall PrefixExp Name FunArg -- ^/prefixexp : name ( funarg )/
-    deriving (Show, Eq)
+    deriving (Show, Eq, Data, Typeable)
 
 data FunArg
     = Args [Exp] -- ^list of args
     | TableArg [TableField] -- ^table constructor
     | StringArg String -- ^string
-    deriving (Show, Eq)
+    deriving (Show, Eq, Data, Typeable)
