diff --git a/release-notes/CREDITS b/release-notes/CREDITS
index 4d75247..4cc71eb 100644
--- a/release-notes/CREDITS
+++ b/release-notes/CREDITS
@@ -907,5 +907,7 @@
 Stuart Dootson:
   * Reported [Issue-13] Runtime error passing multiple injected values to a constructor
    [1.9.7]
-   
-   
\ No newline at end of file
+
+Klaus Reimer:   
+  * [JACKSON-834] Could	not use	@JsonFactory with non-String argument with Enums
+   [1.9.7]
diff --git a/release-notes/VERSION b/release-notes/VERSION
index da0ee8c..70f8fbb 100644
--- a/release-notes/VERSION
+++ b/release-notes/VERSION
@@ -26,6 +26,8 @@
    (reported by James R)
   * [JACKSON-832] (partial) Fix numeric range check for Longs (was not working)
    (reported by Jan J)
+  * [JACKSON-834] Could not use @JsonFactory with non-String argument with Enums
+   (reported by Klaus R)
 
 ------------------------------------------------------------------------
 === History: ===
diff --git a/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumDeserializer.java b/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumDeserializer.java
index 9c06f55..0625ed5 100644
--- a/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumDeserializer.java
+++ b/src/mapper/java/org/codehaus/jackson/map/deser/std/EnumDeserializer.java
@@ -45,13 +45,21 @@
             Class<?> enumClass, AnnotatedMethod factory)
     {
         // note: caller has verified there's just one arg; but we must verify its type
-        if (factory.getParameterType(0) != String.class) {
-            throw new IllegalArgumentException("Parameter #0 type for factory method ("+factory+") not suitable, must be java.lang.String");
+        Class<?> raw = factory.getParameterClass(0);
+        if (raw == String.class) {
+            raw = null;
+        } else  if (raw == Integer.TYPE || raw == Integer.class) {
+            raw = Integer.class;
+        } else  if (raw == Long.TYPE || raw == Long.class) {
+            raw = Long.class;
+        } else {
+            throw new IllegalArgumentException("Parameter #0 type for factory method ("+factory
+                    +") not suitable, must be java.lang.String or int/Integer/long/Long");
         }
         if (config.isEnabled(DeserializationConfig.Feature.CAN_OVERRIDE_ACCESS_MODIFIERS)) {
             ClassUtil.checkAndFixAccess(factory.getMember());
         }
-        return new FactoryBasedDeserializer(enumClass, factory);
+        return new FactoryBasedDeserializer(enumClass, factory, raw);
     }
     
     /*
@@ -108,26 +116,35 @@
         extends StdScalarDeserializer<Object>
     {
         protected final Class<?> _enumClass;
+
+        // Marker type; null if String expected; otherwise numeric wrapper
+        protected final Class<?> _inputType;
         protected final Method _factory;
         
-        public FactoryBasedDeserializer(Class<?> cls, AnnotatedMethod f)
+        public FactoryBasedDeserializer(Class<?> cls, AnnotatedMethod f,
+                Class<?> inputType)
         {
             super(Enum.class);
             _enumClass = cls;
             _factory = f.getAnnotated();
+            _inputType = inputType;
         }
 
         @Override
         public Object deserialize(JsonParser jp, DeserializationContext ctxt)
             throws IOException, JsonProcessingException
         {
-            JsonToken curr = jp.getCurrentToken();
-            
-            // Usually should just get string value:
-            if (curr != JsonToken.VALUE_STRING && curr != JsonToken.FIELD_NAME) {
+            // couple of accepted types...
+            Object value;
+            if (_inputType == null) {
+                value = jp.getText();
+            } else  if (_inputType == Integer.class) {
+                value = Integer.valueOf(jp.getValueAsInt());
+            } else  if (_inputType == Long.class) {
+                value = Long.valueOf(jp.getValueAsLong());
+            } else {
                 throw ctxt.mappingException(_enumClass);
             }
-            String value = jp.getText();
             try {
                 return _factory.invoke(_enumClass, value);
             } catch (Exception e) {
diff --git a/src/test/org/codehaus/jackson/map/deser/TestEnumDeserialization.java b/src/test/org/codehaus/jackson/map/deser/TestEnumDeserialization.java
index 39a61dd..e7162bc 100644
--- a/src/test/org/codehaus/jackson/map/deser/TestEnumDeserialization.java
+++ b/src/test/org/codehaus/jackson/map/deser/TestEnumDeserialization.java
@@ -57,6 +57,24 @@
         @Override
         public String toString() { return name().toLowerCase(); }
     }
+
+    protected enum TestEnumFor834
+    {
+        ENUM_A(1), ENUM_B(2), ENUM_C(3);
+        
+        private final int id;
+        
+        private TestEnumFor834(int id) {
+            this.id = id;
+        }
+        
+        @JsonCreator public static TestEnumFor834 fromId(int id) {
+            for (TestEnumFor834 e: values()) {
+                if (e.id == id) return e;
+            }
+            return null;
+        }
+    }
     
     /*
     /**********************************************************
@@ -222,4 +240,12 @@
                  new TypeReference<EnumSet<EnumWithCreator>>() {});
          assertTrue(value.contains(EnumWithCreator.A));
    }
+
+   // [JACKSON-834]
+   public void testEnumsFromInts() throws Exception
+   {
+       ObjectMapper mapper = new ObjectMapper();
+       TestEnumFor834 res = mapper.readValue("1 ", TestEnumFor834.class);
+       assertSame(TestEnumFor834.ENUM_A, res);
+   }
 }
