diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java
index 11b3e70a56cbc3ac02e309ba5ced58a7bd8537a3..1d640cebe49543903641d97876793e21ceb4ac94 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java
@@ -935,9 +935,9 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
 		switch (field.getSQLType())
 		{
 			case Types.BIT:
-				return new Boolean(getBoolean(columnIndex));
+				return getBoolean(columnIndex) ? Boolean.TRUE : Boolean.FALSE;
 			case Types.SMALLINT:
-				return new Short((short)getInt(columnIndex));
+				return new Short(getShort(columnIndex));
 			case Types.INTEGER:
 				return new Integer(getInt(columnIndex));
 			case Types.BIGINT:
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java
index e30849bbe6b96935e8fe725c512b2412d6dd655f..43c5e3d2d861cdf742a6230cb3e7e23810bab0d1 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java
@@ -780,9 +780,9 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
 		switch (field.getSQLType())
 		{
 			case Types.BIT:
-				return new Boolean(getBoolean(columnIndex));
+				return getBoolean(columnIndex) ? Boolean.TRUE : Boolean.FALSE;
 			case Types.SMALLINT:
-				return new Short((short)getInt(columnIndex));
+				return new Short(getShort(columnIndex));
 			case Types.INTEGER:
 				return new Integer(getInt(columnIndex));
 			case Types.BIGINT:
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSetMetaData.java b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSetMetaData.java
index 6ff6094b64df0e8d3d4f458343c6d8f89896228c..91ee4b306beee0b540786bdba928af0cca44f981 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSetMetaData.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSetMetaData.java
@@ -471,6 +471,21 @@ public class ResultSetMetaData implements java.sql.ResultSetMetaData
 	// ** JDBC 2 Extensions **
 
 	// This can hook into our PG_Object mechanism
+	/**
+	 * Returns the fully-qualified name of the Java class whose instances 
+	 * are manufactured if the method <code>ResultSet.getObject</code>
+	 * is called to retrieve a value from the column.
+	 * 
+	 * <code>ResultSet.getObject</code> may return a subclass of the class
+	 * returned by this method.
+	 *
+	 * @param column the first column is 1, the second is 2, ...
+	 * @return the fully-qualified name of the class in the Java programming
+	 *         language that would be used by the method
+	 *         <code>ResultSet.getObject</code> to retrieve the value in the specified
+	 *         column. This is the class name used for custom mapping.
+	 * @exception SQLException if a database access error occurs
+	 */
 	public String getColumnClassName(int column) throws SQLException
 	{
  /*
@@ -505,34 +520,47 @@ public class ResultSetMetaData implements java.sql.ResultSetMetaData
      Types.TIMESTAMP,Types.TIMESTAMP
  */
 
-	int sql_type = getField(column).getSQLType();
-
-     	switch (sql_type)
-        {
-       		case Types.BIT:
-         		return("java.lang.Boolean");
-       		case Types.SMALLINT:
-         		return("java.lang.Integer");
-       		case Types.INTEGER:
-         		return("java.lang.Integer");
-       		case Types.BIGINT:
-         		return("java.lang.Long");
-      		case Types.NUMERIC:
-         		return("java.math.BigDecimal");
-       		case Types.REAL:
-         		return("java.lang.Float");
-       		case Types.DOUBLE:
-         		return("java.lang.Double");
-       		case Types.CHAR:
-       		case Types.VARCHAR:
-         		return("java.lang.String");
-       		case Types.DATE:
-       		case Types.TIME:
-       		case Types.TIMESTAMP:
-         		return("java.sql.Timestamp");
-       		default:
-	 		throw org.postgresql.Driver.notImplemented();
-       }
-   }       
+		Field field = getField(column);
+		int sql_type = field.getSQLType();
+
+		switch (sql_type)
+		{
+			case Types.BIT:
+				return("java.lang.Boolean");
+			case Types.SMALLINT:
+				return("java.lang.Short");
+			case Types.INTEGER:
+				return("java.lang.Integer");
+			case Types.BIGINT:
+				return("java.lang.Long");
+			case Types.NUMERIC:
+				return("java.math.BigDecimal");
+			case Types.REAL:
+				return("java.lang.Float");
+			case Types.DOUBLE:
+				return("java.lang.Double");
+			case Types.CHAR:
+			case Types.VARCHAR:
+				return("java.lang.String");
+			case Types.DATE:
+				return("java.sql.Date");
+			case Types.TIME:
+				return("java.sql.Time");
+			case Types.TIMESTAMP:
+				return("java.sql.Timestamp");
+			case Types.BINARY:
+			case Types.VARBINARY:
+				return("java.sql.Object");
+			case Types.ARRAY:
+				return("java.sql.Array");
+			default:
+				String type = field.getPGType();
+				if ("unknown".equals(type))
+				{
+					return("java.lang.String");
+				}
+				return("java.lang.Object");
+		}
+	}
 }