diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
index a7887fa..fbb2732 100644
--- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
+++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
@@ -26,7 +26,6 @@
 import org.apache.openjpa.jdbc.meta.strats.NoneDiscriminatorStrategy;
 import org.apache.openjpa.jdbc.meta.strats.VerticalClassStrategy;
 import org.apache.openjpa.jdbc.sql.DBDictionary;
-import org.apache.openjpa.jdbc.sql.Raw;
 import org.apache.openjpa.kernel.exps.AggregateListener;
 import org.apache.openjpa.kernel.exps.Arguments;
 import org.apache.openjpa.kernel.exps.Expression;
@@ -578,24 +577,7 @@
     private Value getLiteralRawString(Value val) {
         if (val instanceof Lit) {
             Lit lit = (Lit) val;
-            StringBuilder value = new StringBuilder();
-            int pType = lit.getParseType();
-            if (pType == Literal.TYPE_SQ_STRING ||
-                pType == Literal.TYPE_STRING)
-                value.append("'").append(lit.getValue().toString()).append("'");
-            else if (pType == Literal.TYPE_BOOLEAN) {
-                Boolean boolVal = (Boolean)lit.getValue();
-                if (_isBooleanLiteralAsNumeric)
-                    value.append(boolVal ? "1" : "0");
-                else
-                    value.append(boolVal ? "true" : "false");
-            } else if (pType == Literal.TYPE_ENUM) {
-                lit.setRaw(true);
-                return val;
-            } else
-                value.append(lit.getValue().toString());
-            lit.setValue(new Raw(value.toString()));
-            return lit;
+            lit.setRaw(true);
         }
         return val;
     }
diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Lit.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Lit.java
index a0ed1bc..1323b54 100644
--- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Lit.java
+++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Lit.java
@@ -39,7 +39,6 @@
     private Object _val;
     private int _ptype;
     private boolean _isRaw;
-    private Object _rawVal;
 
     /**
      * Constructor. Supply literal value.
@@ -54,9 +53,10 @@
 
     @Override
     public Class getType() {
-        if (_isRaw && _rawVal != null)
-            return Raw.class;
-        return (_val == null) ? Object.class : _val.getClass();
+        if (_val == null) {
+            return Object.class;
+        }
+        return _val.getClass();
     }
 
     @Override
@@ -92,10 +92,6 @@
         _isRaw = isRaw;
     }
 
-    public Object getRawValue() {
-        return _rawVal;
-    }
-
     @Override
     public ExpState initialize(Select sel, ExpContext ctx, int flags) {
         return new LitExpState();
@@ -112,8 +108,7 @@
     }
 
     @Override
-    public void calculateValue(Select sel, ExpContext ctx, ExpState state,
-        Val other, ExpState otherState) {
+    public void calculateValue(Select sel, ExpContext ctx, ExpState state, Val other, ExpState otherState) {
         super.calculateValue(sel, ctx, state, other, otherState);
         LitExpState lstate = (LitExpState) state;
         if (other != null) {
@@ -124,8 +119,7 @@
     }
 
     @Override
-    public void appendTo(Select sel, ExpContext ctx, ExpState state,
-        SQLBuffer sql, int index) {
+    public void appendTo(Select sel, ExpContext ctx, ExpState state, SQLBuffer sql, int index) {
         LitExpState lstate = (LitExpState) state;
         if (lstate.otherLength > 1) {
             sql.appendValue(((Object[]) lstate.sqlValue)[index], lstate.getColumn(index));
@@ -133,7 +127,21 @@
             return;
         } else if (_isRaw) {
             int parseType = getParseType();
-            if (parseType == Literal.TYPE_ENUM) {
+            if (parseType == Literal.TYPE_SQ_STRING || parseType == Literal.TYPE_STRING) {
+                lstate.sqlValue = new Raw("'" + _val.toString() + "'");
+            } else if (parseType == Literal.TYPE_BOOLEAN) {
+                Boolean boolVal = (Boolean)_val;
+                Object dbRepresentation = ctx.store.getDBDictionary().getBooleanRepresentation().getRepresentation(boolVal);
+                if (dbRepresentation instanceof String) {
+                    lstate.sqlValue = new Raw("'" + dbRepresentation.toString() + "'");
+                } else if (dbRepresentation instanceof Boolean ||
+                           dbRepresentation instanceof Integer) {
+                    lstate.sqlValue = new Raw(dbRepresentation.toString());
+                } else {
+                    // continue without Raw
+                    lstate.sqlValue = _val;
+                }
+            } else if (parseType == Literal.TYPE_ENUM) {
                 StringBuilder value = new StringBuilder();
                 boolean isOrdinal = false;
                 if (lstate.sqlValue instanceof Integer)
@@ -144,18 +152,16 @@
                 if (!isOrdinal)
                     value.append("'");
                 lstate.sqlValue = new Raw(value.toString());
-                _rawVal = lstate.sqlValue;
             } else if (parseType == Literal.TYPE_DATE || parseType == Literal.TYPE_TIME ||
                 parseType == Literal.TYPE_TIMESTAMP) {
                 lstate.sqlValue = new Raw(_val.toString());
-                _rawVal = lstate.sqlValue;
+            } else if (parseType == Literal.TYPE_NUMBER) {
+                lstate.sqlValue = new Raw(_val.toString());
             } else {
                 lstate.sqlValue = new Raw(_val instanceof String ? "'"+_val+"'" : _val.toString());
-                _rawVal = lstate.sqlValue;
             }
         }
         Object useLiteral = ctx.fetch.getHint(QueryHints.HINT_USE_LITERAL_IN_SQL);
-//        useLiteral = true;
         boolean useParamToken = useLiteral != null ? !(Boolean)useLiteral : true;
         sql.appendValue(lstate.sqlValue, lstate.getColumn(index), null, useParamToken);
     }
diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/TestAggregateFunctions.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/TestAggregateFunctions.java
index b1cb054..9225d28 100644
--- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/TestAggregateFunctions.java
+++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/TestAggregateFunctions.java
@@ -111,12 +111,10 @@
         em.persist(ae2);
         em.getTransaction().commit();
 
-/*X
         em.getTransaction().begin();
         final TypedQuery<Long> q2 = em.createQuery("select SUM(ae.intVal) from AggEntity AS ae", Long.class);
         final Long sum = q2.getSingleResult();
         assertEquals(2L, (long) sum);
-*/
 
         final TypedQuery<Long> q = em.createQuery("select SUM(CASE ae.stringVal WHEN 'bare' THEN 1 ELSE 0 END) from AggEntity AS ae", Long.class);
         final Long sumC = q.getSingleResult();
diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestJPQLScalarExpressions.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestJPQLScalarExpressions.java
index 7aacca6..597b947 100644
--- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestJPQLScalarExpressions.java
+++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestJPQLScalarExpressions.java
@@ -319,7 +319,7 @@
         List rs3 = em.createQuery(query3).getResultList();
         Object[] result3 = (Object[]) rs3.get(0);
         assertEquals("the name is not Jacob", "Jacob", result3[0]);
-        assertEquals("the credit rating is not 'POOR'", "POOR", result3[1]);
+        assertEquals("the credit rating is not 'POOR'", CompUser.CreditRating.POOR, result3[1]);
 
         String update2 = "update CompUser c set c.creditRating = " +
             " CASE WHEN c.name ='Jacob' THEN " +
