diff --git a/Pugs.cabal b/Pugs.cabal
--- a/Pugs.cabal
+++ b/Pugs.cabal
@@ -1,9 +1,9 @@
 Name            : Pugs
-Version         : 6.2.13.20111008
+Version         : 6.2.13.20120203
 license         : BSD3
 license-file    : LICENSE
 cabal-version   : >= 1.2.3
-copyright       : 2005-2008, The Pugs Contributors
+copyright       : 2005-2012, The Pugs Contributors
 maintainer      : Audrey Tang <audreyt@audreyt.org>
 category        : Language, Pugs
 stability       : experimental
@@ -12,7 +12,7 @@
 synopsis        : A Perl 6 Implementation
 description     : A Perl 6 Implementation
 author          : Audrey Tang <audreyt@audreyt.org>
-Tested-With:    GHC==6.8.2, GHC==6.8.3, GHC==6.10.1, GHC==6.12.1, GHC==7.0.1, GHC==7.2.1
+Tested-With:    GHC==6.8.2, GHC==6.8.3, GHC==6.10.1, GHC==6.12.1, GHC==7.0.1, GHC==7.2.1, GHC==7.4.1
 data-files      :
     blib6/pugs/perl5/lib/Parse/Yapp/Driver.pm
     blib6/pugs/perl5/lib/Parse/Yapp/Grammar.pm
diff --git a/src/Pugs/AST.hs b/src/Pugs/AST.hs
--- a/src/Pugs/AST.hs
+++ b/src/Pugs/AST.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -cpp -fglasgow-exts -fno-warn-orphans -funbox-strict-fields -fallow-overlapping-instances -fparr #-}
+{-# OPTIONS_GHC -cpp -fglasgow-exts -fno-warn-orphans -funbox-strict-fields -fallow-overlapping-instances #-}
 {-# LANGUAGE GADTs #-}
 
 {-|
diff --git a/src/Pugs/AST/Functions.hs b/src/Pugs/AST/Functions.hs
--- a/src/Pugs/AST/Functions.hs
+++ b/src/Pugs/AST/Functions.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -fglasgow-exts -fno-warn-orphans -fallow-overlapping-instances -fallow-undecidable-instances -fparr #-}
+{-# OPTIONS_GHC -fglasgow-exts -fno-warn-orphans -fallow-overlapping-instances -fallow-undecidable-instances #-}
 module Pugs.AST.Functions where
 import Pugs.Internals
 import Pugs.Types
diff --git a/src/Pugs/AST/Internals.hs b/src/Pugs/AST/Internals.hs
--- a/src/Pugs/AST/Internals.hs
+++ b/src/Pugs/AST/Internals.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -cpp -fglasgow-exts -fno-warn-orphans -fallow-overlapping-instances -fallow-undecidable-instances -fparr #-}
+{-# OPTIONS_GHC -cpp -fglasgow-exts -fno-warn-orphans -fallow-overlapping-instances -fallow-undecidable-instances #-}
 {-# LANGUAGE GADTs #-}
 
 module Pugs.AST.Internals (
diff --git a/src/Pugs/AST/Internals/Instances.hs b/src/Pugs/AST/Internals/Instances.hs
--- a/src/Pugs/AST/Internals/Instances.hs
+++ b/src/Pugs/AST/Internals/Instances.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -cpp -fglasgow-exts -fno-warn-orphans -fallow-overlapping-instances -fallow-undecidable-instances -fparr #-}
+{-# OPTIONS_GHC -cpp -fglasgow-exts -fno-warn-orphans -fallow-overlapping-instances -fallow-undecidable-instances #-}
 {-# LANGUAGE GADTs #-}
 
 
diff --git a/src/Pugs/AST/Pad.hs b/src/Pugs/AST/Pad.hs
--- a/src/Pugs/AST/Pad.hs
+++ b/src/Pugs/AST/Pad.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -fglasgow-exts -fparr #-}
+{-# OPTIONS_GHC -fglasgow-exts #-}
 {-# LANGUAGE GADTs #-}
 module Pugs.AST.Pad (
   mkPad, unionPads, padKeys, filterPad, adjustPad, mergePadEntry,
diff --git a/src/Pugs/AST/Types.hs b/src/Pugs/AST/Types.hs
--- a/src/Pugs/AST/Types.hs
+++ b/src/Pugs/AST/Types.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -fglasgow-exts -fno-warn-orphans -fallow-overlapping-instances -fallow-undecidable-instances -fparr #-}
+{-# OPTIONS_GHC -fglasgow-exts -fno-warn-orphans -fallow-overlapping-instances -fallow-undecidable-instances #-}
 module Pugs.AST.Types where
 import Pugs.Internals
 import Pugs.Types
diff --git a/src/Pugs/Class.hs b/src/Pugs/Class.hs
--- a/src/Pugs/Class.hs
+++ b/src/Pugs/Class.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -fglasgow-exts -fparr -fallow-undecidable-instances -fallow-incoherent-instances #-}
+{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances -fallow-incoherent-instances #-}
 
 {-|
     Class meta-model.  (object meta-meta-model)
diff --git a/src/Pugs/Compile/Pugs.hs b/src/Pugs/Compile/Pugs.hs
--- a/src/Pugs/Compile/Pugs.hs
+++ b/src/Pugs/Compile/Pugs.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -fglasgow-exts -fallow-overlapping-instances -fparr #-}
+{-# OPTIONS_GHC -fglasgow-exts -fallow-overlapping-instances #-}
 {-# LANGUAGE GADTs #-}
 
 module Pugs.Compile.Pugs (genPugs) where
diff --git a/src/Pugs/Eval.hs b/src/Pugs/Eval.hs
--- a/src/Pugs/Eval.hs
+++ b/src/Pugs/Eval.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -fglasgow-exts -cpp -fno-warn-deprecations -fallow-overlapping-instances -fparr #-}
+{-# OPTIONS_GHC -fglasgow-exts -cpp -fno-warn-deprecations -fallow-overlapping-instances #-}
 {-# LANGUAGE GADTs #-}
 
 {-|
diff --git a/src/Pugs/Eval/Var.hs b/src/Pugs/Eval/Var.hs
--- a/src/Pugs/Eval/Var.hs
+++ b/src/Pugs/Eval/Var.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -fglasgow-exts -fallow-overlapping-instances -funbox-strict-fields -fparr #-}
+{-# OPTIONS_GHC -fglasgow-exts -fallow-overlapping-instances -funbox-strict-fields #-}
 {-# LANGUAGE GADTs #-}
 
 module Pugs.Eval.Var (
diff --git a/src/Pugs/Internals.hs b/src/Pugs/Internals.hs
--- a/src/Pugs/Internals.hs
+++ b/src/Pugs/Internals.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -fglasgow-exts -fno-warn-orphans -fallow-undecidable-instances -fallow-overlapping-instances -fparr #-}
+{-# OPTIONS_GHC -fglasgow-exts -fno-warn-orphans -fallow-undecidable-instances -fallow-overlapping-instances #-}
 
 {-|
     Internal utilities and library imports.
diff --git a/src/Pugs/Prim/Numeric.hs b/src/Pugs/Prim/Numeric.hs
--- a/src/Pugs/Prim/Numeric.hs
+++ b/src/Pugs/Prim/Numeric.hs
@@ -7,8 +7,8 @@
 import Pugs.Internals
 import Pugs.AST
 import Pugs.Types
-
 import Pugs.Prim.Lifts
+import GHC.Real (denominator)
 
 op2OrdNumeric :: Value b => (forall a. (Ord a) => a -> a -> b) -> Val -> Val -> Eval Val
 op2OrdNumeric f x y
@@ -119,13 +119,13 @@
     if num1 == (1 :: VNum) then return (VInt 1) else do
     num2 <- fromVal =<< fromVal' y
     if isNaN num2 then return (VNum (0/0)) else do
-    if num2 == (0 :: VNum) then return (VInt 1) else do
-    case reverse $ show (num2 :: VNum) of
-        ('0':'.':_) -> do
-            num1 <- fromVal =<< fromVal' x
-            if isDigit . head $ show (num1 :: VNum)
-                then op2Rat ((^^) :: VRat -> VInt -> VRat) x y
-                else op2Floating (**) x y
+    rat2 <- fromVal =<< fromVal' y
+    if rat2 == (0 :: VRat) then return (VInt 1) else do
+    case denominator (rat2 :: VRat) of
+        1 | rat2 > 0 -> do
+            if (num2 :: VNum) >= 0
+                then op2Rat ((^) :: VRat -> VInt -> VRat) x y
+                else op2Rat ((^^) :: VRat -> VInt -> VRat) x y
         _ -> op2Floating (**) x y
 
 op2Divide :: Val -> Val -> Eval Val
diff --git a/src/Pugs/Types.hs b/src/Pugs/Types.hs
--- a/src/Pugs/Types.hs
+++ b/src/Pugs/Types.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -fglasgow-exts -fno-warn-deprecations -fno-warn-orphans -funbox-strict-fields -fallow-overlapping-instances -fparr #-}
+{-# OPTIONS_GHC -fglasgow-exts -fno-warn-deprecations -fno-warn-orphans -funbox-strict-fields -fallow-overlapping-instances #-}
 {-|
     Implementation Types.
 
@@ -130,7 +130,7 @@
 enumCxt (CxtSlurpy _) = 1
 
 -- | Return the 'Cxt' corresponding to the given P5 calling convention bits.
-cxtEnum :: (Show a, Num a) => a -> Cxt
+cxtEnum :: (Show a, Num a, Eq a) => a -> Cxt
 cxtEnum 128 = CxtVoid
 cxtEnum 0   = cxtItemAny
 cxtEnum 1   = cxtSlurpyAny
diff --git a/src/Pugs/Val/Code.hs b/src/Pugs/Val/Code.hs
--- a/src/Pugs/Val/Code.hs
+++ b/src/Pugs/Val/Code.hs
@@ -6,7 +6,7 @@
 -- import Pugs.Val.Capture
 import Pugs.Class
 import Text.PrettyPrint
-import Data.Monoid
+import Data.Monoid (Monoid(..))
 import qualified Data.Map as Map
 import qualified Data.Set as Set
 import qualified Pugs.Types as Types
