diff --git a/src/node/index.js b/src/node/index.js
index ba73e3dac8f2e98fdecf6fe417b13441a89b636a..071bfd7927bab798c2bf0920355be32c54cd7242 100644
--- a/src/node/index.js
+++ b/src/node/index.js
@@ -64,6 +64,8 @@ grpc.setDefaultRootsPem(fs.readFileSync(SSL_ROOTS_PATH, 'ascii'));
  *   Buffers. Defaults to false
  * - longsAsStrings: deserialize long values as strings instead of objects.
  *   Defaults to true
+ * - enumsAsStrings: deserialize enum values as strings instead of numbers.
+ *   Defaults to true
  * - deprecatedArgumentOrder: Use the beta method argument order for client
  *   methods, with optional arguments after the callback. Defaults to false.
  *   This option is only a temporary stopgap measure to smooth an API breakage.
@@ -131,6 +133,8 @@ function applyProtoRoot(filename, root) {
  *   Buffers. Defaults to false
  * - longsAsStrings: deserialize long values as strings instead of objects.
  *   Defaults to true
+ * - enumsAsStrings: deserialize enum values as strings instead of numbers.
+ *   Defaults to true
  * - deprecatedArgumentOrder: Use the beta method argument order for client
  *   methods, with optional arguments after the callback. Defaults to false.
  *   This option is only a temporary stopgap measure to smooth an API breakage.
diff --git a/src/node/src/common.js b/src/node/src/common.js
index 93df5138172f69e2a393746021f5ae7b998e620a..757969dbddb147a162738d6e61977cd6904d7229 100644
--- a/src/node/src/common.js
+++ b/src/node/src/common.js
@@ -87,5 +87,6 @@ exports.defaultGrpcOptions = {
   convertFieldsToCamelCase: false,
   binaryAsBase64: false,
   longsAsStrings: true,
+  enumsAsStrings: true,
   deprecatedArgumentOrder: false
 };
diff --git a/src/node/src/protobuf_js_6_common.js b/src/node/src/protobuf_js_6_common.js
index 6a85e4ac23df93ce85d07d976e49e8d066b4c61f..baa62cce866ff05c24bf43b4bf06c79d3ca5d87d 100644
--- a/src/node/src/protobuf_js_6_common.js
+++ b/src/node/src/protobuf_js_6_common.js
@@ -50,7 +50,7 @@ exports.deserializeCls = function deserializeCls(cls, options) {
     defaults: true,
     bytes: options.binaryAsBase64 ? String : Buffer,
     longs: options.longsAsStrings ? String : null,
-    enums: String,
+    enums: options.enumsAsStrings ? String : null,
     oneofs: true
   };
   /**
diff --git a/src/node/test/common_test.js b/src/node/test/common_test.js
index 4b7a8c22537dcc5efc030450546f6a96892ab87c..39ff6a5f1fceee7cd62e0d405ba091280258df3f 100644
--- a/src/node/test/common_test.js
+++ b/src/node/test/common_test.js
@@ -179,3 +179,25 @@ describe('Proto message oneof serialize and deserialize', function() {
     assert.equal(deserialized2.oneof_choice, 'int_choice');
   });
 });
+describe('Proto message enum serialize and deserialize', function() {
+  var enumSerialize = serializeCls(messages_proto.EnumValues);
+  var enumDeserialize = deserializeCls(
+      messages_proto.EnumValues, default_options);
+  var enumIntOptions = _.defaults({enumsAsStrings: false}, default_options);
+  var enumIntDeserialize = deserializeCls(
+      messages_proto.EnumValues, enumIntOptions);
+  it('Should accept both names and numbers', function() {
+    var nameSerialized = enumSerialize({enum_value: 'ONE'});
+    var numberSerialized = enumSerialize({enum_value: 1});
+    assert.strictEqual(messages_proto.TestEnum.ONE, 1);
+    assert.deepEqual(enumDeserialize(nameSerialized),
+                     enumDeserialize(numberSerialized));
+  });
+  it('Should deserialize as a string the enumsAsStrings option', function() {
+    var serialized = enumSerialize({enum_value: 'TWO'});
+    var nameDeserialized = enumDeserialize(serialized);
+    var numberDeserialized = enumIntDeserialize(serialized);
+    assert.deepEqual(nameDeserialized, {enum_value: 'TWO'});
+    assert.deepEqual(numberDeserialized, {enum_value: 2});
+  });
+});
diff --git a/src/node/test/test_messages.proto b/src/node/test/test_messages.proto
index 2cd133161b7b5b5fbd5b948c14c7876076ccf3c6..ae70f6e152a5acc2141dd06db372776ccb2261d4 100644
--- a/src/node/test/test_messages.proto
+++ b/src/node/test/test_messages.proto
@@ -47,4 +47,14 @@ message OneOfValues {
     int32 int_choice = 1;
     string string_choice = 2;
   }
+}
+
+enum TestEnum {
+  ZERO = 0;
+  ONE = 1;
+  TWO = 2;
+}
+
+message EnumValues {
+  TestEnum enum_value = 1;
 }
\ No newline at end of file