diff --git a/com.google.eclipse.protobuf.feature/feature.xml b/com.google.eclipse.protobuf.feature/feature.xml
index 7c1e61f..bf5e092 100644
--- a/com.google.eclipse.protobuf.feature/feature.xml
+++ b/com.google.eclipse.protobuf.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="com.google.eclipse.protobuf"
       label="%featureName"
-      version="1.0.11.qualifier"
+      version="1.1.0.qualifier"
       provider-name="%providerName">
 
    <description url="https://code.google.com/p/protobuf-dt/">
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/Properties_isBool_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/MessageFields_isBool_Test.java
similarity index 82%
rename from com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/Properties_isBool_Test.java
rename to com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/MessageFields_isBool_Test.java
index 4959897..0a43f41 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/Properties_isBool_Test.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/MessageFields_isBool_Test.java
@@ -18,18 +18,18 @@
 import com.google.eclipse.protobuf.protobuf.MessageField;
 
 /**
- * Tests for <code>{@link Fields#isBool(MessageField)}</code>.
+ * Tests for <code>{@link MessageFields#isBool(MessageField)}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class Properties_isBool_Test {
+public class MessageFields_isBool_Test {
 
   @Rule public XtextRule xtext = createWith(unitTestSetup());
 
-  private Fields properties;
+  private MessageFields fields;
 
   @Before public void setUp() {
-    properties = xtext.getInstanceOf(Fields.class);
+    fields = xtext.getInstanceOf(MessageFields.class);
   }
 
   // syntax = "proto2";
@@ -39,7 +39,7 @@
   // }
   @Test public void should_return_true_if_field_is_bool() {
     MessageField field = xtext.find("code", MessageField.class);
-    assertTrue(properties.isBool(field));
+    assertTrue(fields.isBool(field));
   }
 
   // syntax = "proto2";
@@ -49,6 +49,6 @@
   // }
   @Test public void should_return_false_if_property_is_not_bool() {
     MessageField field = xtext.find("name", MessageField.class);
-    assertFalse(properties.isBool(field));
+    assertFalse(fields.isBool(field));
   }
 }
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/Properties_isPrimitive_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/MessageFields_isPrimitive_Test.java
similarity index 75%
rename from com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/Properties_isPrimitive_Test.java
rename to com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/MessageFields_isPrimitive_Test.java
index ec37bbf..c1eef68 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/Properties_isPrimitive_Test.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/MessageFields_isPrimitive_Test.java
@@ -21,18 +21,18 @@
 import com.google.eclipse.protobuf.protobuf.MessageField;
 
 /**
- * Tests for <code>{@link Fields#isPrimitive(MessageField)}</code>.
+ * Tests for <code>{@link MessageFields#isPrimitive(MessageField)}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class Properties_isPrimitive_Test {
+public class MessageFields_isPrimitive_Test {
 
   @Rule public XtextRule xtext = createWith(unitTestSetup());
 
-  private Fields properties;
+  private MessageFields fields;
 
   @Before public void setUp() {
-    properties = xtext.getInstanceOf(Fields.class);
+    fields = xtext.getInstanceOf(MessageFields.class);
   }
 
   // syntax = "proto2";
@@ -50,9 +50,9 @@
   //   optional bool bool_1 = 10;
   // }
   @Test public void should_return_true_if_field_is_primitive() {
-    List<MessageField> fields = getAllContentsOfType(xtext.root(), MessageField.class);
-    for (MessageField field : fields)
-      assertTrue(properties.isPrimitive(field));
+    List<MessageField> allFields = getAllContentsOfType(xtext.root(), MessageField.class);
+    for (MessageField field : allFields)
+      assertTrue(fields.isPrimitive(field));
   }
 
   // syntax = "proto2";
@@ -67,8 +67,8 @@
   //   optional string name = 1;
   // }
   @Test public void should_return_false_if_field_is_not_primitive() {
-    List<MessageField> fields = getAllContentsOfType(xtext.root(), MessageField.class);
-    for (MessageField p : fields)
-      assertFalse(properties.isPrimitive(p));
+    List<MessageField> allFields = getAllContentsOfType(xtext.root(), MessageField.class);
+    for (MessageField p : allFields)
+      assertFalse(fields.isPrimitive(p));
   }
 }
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/Properties_isString_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/MessageFields_isString_Test.java
similarity index 81%
rename from com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/Properties_isString_Test.java
rename to com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/MessageFields_isString_Test.java
index 0270976..7c8a2c1 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/Properties_isString_Test.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/MessageFields_isString_Test.java
@@ -18,18 +18,18 @@
 import com.google.eclipse.protobuf.protobuf.MessageField;
 
 /**
- * Tests for <code>{@link Fields#isString(MessageField)}</code>.
+ * Tests for <code>{@link MessageFields#isString(MessageField)}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class Properties_isString_Test {
+public class MessageFields_isString_Test {
 
   @Rule public XtextRule xtext = createWith(unitTestSetup());
 
-  private Fields properties;
+  private MessageFields fields;
 
   @Before public void setUp() {
-    properties = xtext.getInstanceOf(Fields.class);
+    fields = xtext.getInstanceOf(MessageFields.class);
   }
 
   // syntax = "proto2";
@@ -39,7 +39,7 @@
   // }
   @Test public void should_return_true_if_field_is_string() {
     MessageField field = xtext.find("name", MessageField.class);
-    assertTrue(properties.isString(field));
+    assertTrue(fields.isString(field));
   }
 
   // syntax = "proto2";
@@ -49,6 +49,6 @@
   // }
   @Test public void should_return_false_if_field_is_not_string() {
     MessageField field = xtext.find("code", MessageField.class);
-    assertFalse(properties.isString(field));
+    assertFalse(fields.isString(field));
   }
 }
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/Properties_typeNameOf_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/MessageFields_typeNameOf_Test.java
similarity index 81%
rename from com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/Properties_typeNameOf_Test.java
rename to com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/MessageFields_typeNameOf_Test.java
index c573453..cc251bf 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/Properties_typeNameOf_Test.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/MessageFields_typeNameOf_Test.java
@@ -19,18 +19,18 @@
 import com.google.eclipse.protobuf.protobuf.MessageField;
 
 /**
- * Tests for <code>{@link Fields#typeNameOf(MessageField)}</code>.
+ * Tests for <code>{@link MessageFields#typeNameOf(MessageField)}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class Properties_typeNameOf_Test {
+public class MessageFields_typeNameOf_Test {
 
   @Rule public XtextRule xtext = createWith(unitTestSetup());
 
-  private Fields properties;
+  private MessageFields fields;
 
   @Before public void setUp() {
-    properties = xtext.getInstanceOf(Fields.class);
+    fields = xtext.getInstanceOf(MessageFields.class);
   }
 
   // syntax = "proto2";
@@ -40,7 +40,7 @@
   // }
   @Test public void should_return_name_of_scalar() {
     MessageField field = xtext.find("name", MessageField.class);
-    assertThat(properties.typeNameOf(field), equalTo("string"));
+    assertThat(fields.typeNameOf(field), equalTo("string"));
   }
 
   // syntax = "proto2";
@@ -55,6 +55,6 @@
   // }
   @Test public void should_return_name_of_type() {
     MessageField field = xtext.find("number", MessageField.class);
-    assertThat(properties.typeNameOf(field), equalTo("PhoneNumber"));
+    assertThat(fields.typeNameOf(field), equalTo("PhoneNumber"));
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java
index 9174060..a0c3d35 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java
@@ -47,7 +47,6 @@
  */
 public class ProtobufProposalProvider extends AbstractProtobufProposalProvider {
 
-
   @Inject private IEObjectDescriptionChooser descriptionChooser;
   @Inject private ProtoDescriptorProvider descriptorProvider;
   @Inject private FieldOptions fieldOptions;
@@ -56,8 +55,8 @@
   @Inject private IndexedElements indexedElements;
   @Inject private PluginImageHelper imageHelper;
   @Inject private Literals literals;
+  @Inject private MessageFields messageFields;
   @Inject private Options options;
-  @Inject private Fields properties;
 
   @Override public void completeProtobuf_Syntax(EObject model, Assignment assignment, ContentAssistContext context,
       ICompletionProposalAcceptor acceptor) {}
@@ -83,7 +82,7 @@
     }
   }
 
-  @Override public void completeMessageLink_Target(EObject model, Assignment assignment, ContentAssistContext context, 
+  @Override public void completeMessageLink_Target(EObject model, Assignment assignment, ContentAssistContext context,
       ICompletionProposalAcceptor acceptor) {
     Collection<IEObjectDescription> scope = emptySet();
     if (model instanceof MessageExtension) {
@@ -99,7 +98,7 @@
       proposeAndAccept(d, image, context, acceptor);
     }
   }
-  
+
   @Override public void completeNativeOption_Source(EObject model, Assignment assignment,
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     ProtoDescriptor descriptor = descriptorProvider.primaryDescriptor();
@@ -185,7 +184,7 @@
   private boolean isKeyword(EObject object, CommonKeyword keyword) {
     return object instanceof Keyword && keyword.hasValue(((Keyword) object).getValue());
   }
-  
+
   private void proposeEqualProto2(ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     proposeAndAccept(EQUAL_PROTO2_IN_QUOTES, context, acceptor);
   }
@@ -197,12 +196,12 @@
 
   private boolean isBoolProposalValid(ContentAssistContext context) {
     MessageField field = fieldFrom(context);
-    return field != null && properties.isBool(field);
+    return field != null && messageFields.isBool(field);
   }
 
   private boolean isNanProposalValid(ContentAssistContext context) {
     MessageField field = fieldFrom(context);
-    return field != null && properties.mayBeNan(field);
+    return field != null && messageFields.mayBeNan(field);
   }
 
   private MessageField fieldFrom(ContentAssistContext context) {
@@ -230,7 +229,7 @@
       if (OPTIONAL.equals(modifier)) {
         CompoundElement display = DEFAULT_EQUAL_IN_BRACKETS;
         int cursorPosition = display.indexOf(CLOSING_BRACKET);
-        if (properties.isString(field)) {
+        if (messageFields.isString(field)) {
           display = DEFAULT_EQUAL_STRING_IN_BRACKETS;
           cursorPosition++;
         }
@@ -266,13 +265,13 @@
       field = (MessageField) model.eContainer();
     }
     if (field == null) return;
-    if (!properties.isOptional(field)) return;
+    if (!messageFields.isOptional(field)) return;
     Enum enumType = finder.enumTypeOf(field);
     if (enumType != null) {
       proposeAndAccept(enumType, context, acceptor);
     }
   }
-  
+
   @Override public void completeMessageField_Index(EObject model, Assignment assignment, ContentAssistContext context,
       ICompletionProposalAcceptor acceptor) {
     long index = indexedElements.calculateTagNumberOf((MessageField) model);
@@ -285,7 +284,7 @@
 
   @Override public void completeMessageField_Name(EObject model, Assignment assignment, ContentAssistContext context,
       ICompletionProposalAcceptor acceptor) {
-    String typeName = toFirstLower(properties.typeNameOf((MessageField) model));
+    String typeName = toFirstLower(messageFields.typeNameOf((MessageField) model));
     int index = 1;
     String name = typeName + index;
     for (EObject o : model.eContainer().eContents()) {
@@ -343,10 +342,10 @@
       ICompletionProposalAcceptor acceptor) {
     if (!(e instanceof MessageField)) return;
     MessageField field = (MessageField) e;
-    if (!properties.isOptional(field) || existingOptionNames.contains(DEFAULT.toString())) return;
+    if (!messageFields.isOptional(field) || existingOptionNames.contains(DEFAULT.toString())) return;
     CompoundElement display = DEFAULT_EQUAL;
     int cursorPosition = display.charCount();
-    if (properties.isString(field)) {
+    if (messageFields.isString(field)) {
       display = DEFAULT_EQUAL_STRING;
       cursorPosition++;
     }
@@ -356,7 +355,7 @@
   private boolean canBePacked(IndexedElement e) {
     if (!(e instanceof MessageField)) return false;
     MessageField field = (MessageField) e;
-    return properties.isPrimitive(field) && REPEATED.equals(field.getModifier());
+    return messageFields.isPrimitive(field) && REPEATED.equals(field.getModifier());
   }
 
   private void proposeOption(MessageField optionSource, ContentAssistContext context,
@@ -373,14 +372,14 @@
     }
     acceptor.accept(proposal);
   }
-  
+
   private Object defaultValueOf(MessageField field) {
-    if (properties.isBool(field)) return TRUE;
-    if (properties.isString(field)) return EMPTY_STRING;
+    if (messageFields.isBool(field)) return TRUE;
+    if (messageFields.isString(field)) return EMPTY_STRING;
     return null;
   }
-  
-  @Override public void completeDefaultValueFieldOption_Value(EObject model, Assignment assignment, 
+
+  @Override public void completeDefaultValueFieldOption_Value(EObject model, Assignment assignment,
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     MessageField field = null;
     if (model instanceof DefaultValueFieldOption) {
@@ -390,7 +389,7 @@
       field = (MessageField) model;
     }
     if (field == null) return;
-    if (!properties.isOptional(field)) return;
+    if (!messageFields.isOptional(field)) return;
     proposeFieldValue(field, context, acceptor);
   }
 
@@ -410,11 +409,11 @@
 
   private boolean proposePrimitiveValues(MessageField field, ContentAssistContext context,
       ICompletionProposalAcceptor acceptor) {
-    if (properties.isBool(field)) {
+    if (messageFields.isBool(field)) {
       proposeBooleanValues(context, acceptor);
       return true;
     }
-    if (properties.isString(field)) {
+    if (messageFields.isString(field)) {
       proposeEmptyString(context, acceptor);
       return true;
     }
@@ -493,7 +492,7 @@
     proposeAndAccept(scoping().allPossibleNormalFieldsOf(option), context, acceptor);
     proposeExtensionFields(scoping().allPossibleExtensionFieldsOf(option), context, acceptor);
   }
-  
+
   private void proposeExtensionFields(Collection<IEObjectDescription> scope, ContentAssistContext context,
       ICompletionProposalAcceptor acceptor) {
     String format = "(%s)";
@@ -555,7 +554,7 @@
       proposeAndAccept(enumType, context, acceptor);
     }
   }
-  
+
   private void proposeAndAccept(Enum enumType, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     Image image = imageHelper.getImage(images.imageFor(Literal.class));
     for (Literal literal : getAllContentsOfType(enumType, Literal.class))
@@ -621,7 +620,7 @@
   private Scoping scoping() {
     return (ProtobufScopeProvider) super.getScopeProvider();
   }
-  
+
   @Override public ICompletionProposal createCompletionProposal(String proposal, String displayString, Image image,
       ContentAssistContext contentAssistContext) {
     StyledString styled = null;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Labels.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Labels.java
index 665b74a..579a71f 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Labels.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Labels.java
@@ -12,13 +12,13 @@
 import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.IMPORT__IMPORT_URI;
 import static org.eclipse.jface.viewers.StyledString.DECORATIONS_STYLER;
 
+import java.util.List;
+
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jface.viewers.StyledString;
 import org.eclipse.xtext.nodemodel.INode;
 
-import java.util.List;
-
 import com.google.eclipse.protobuf.model.util.*;
 import com.google.eclipse.protobuf.naming.NameResolver;
 import com.google.eclipse.protobuf.protobuf.*;
@@ -32,9 +32,9 @@
 @Singleton public class Labels {
 
   @Inject private NameResolver nameResolver;
+  @Inject private MessageFields messageFields;
   @Inject private INodes nodes;
   @Inject private Options options;
-  @Inject private Fields properties;
 
   public Object labelFor(Object o) {
     if (o instanceof Extensions) {
@@ -70,7 +70,7 @@
     }
     return null;
   }
-  
+
   private Object labelFor(Extensions extensions) {
     StringBuilder builder = new StringBuilder();
     EList<Range> ranges = extensions.getRanges();
@@ -86,7 +86,7 @@
     }
     return builder.toString();
   }
-  
+
   private Object labelFor(Import anImport) {
     INode node = nodes.firstNodeForFeature(anImport, IMPORT__IMPORT_URI);
     if (node == null) return anImport.getImportURI();
@@ -106,7 +106,7 @@
 
   private Object labelFor(MessageField field) {
     StyledString text = new StyledString(nameResolver.nameOf(field));
-    String typeName = properties.typeNameOf(field);
+    String typeName = messageFields.typeNameOf(field);
     if (typeName == null) typeName = "<unresolved reference>"; // TODO move to
                                                                // properties
                                                                // file
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/INodes.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/INodes.java
index b63c1ed..20debce 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/INodes.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/INodes.java
@@ -97,7 +97,7 @@
     TerminalRule terminalRule = (TerminalRule) rule;
     return "STRING".equals(terminalRule.getName());
   }
-  
+
   /**
    * Indicates whether the given node is a hidden leaf node.
    * @param node the node to check.
@@ -107,4 +107,14 @@
     if (!(node instanceof ILeafNode)) return false;
     return ((ILeafNode) node).isHidden();
   }
+
+  /**
+   * Returns the text of the given node, with leading and trailing whitespace omitted.
+   * @param node the given node.
+   * @return  the text of the given node, with leading and trailing whitespace omitted.
+   */
+  public String textOf(INode node) {
+    String text = node.getText();
+    return (text == null) ? null : text.trim();
+  }
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Fields.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/MessageFields.java
similarity index 97%
rename from com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Fields.java
rename to com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/MessageFields.java
index 8d5875c..1970a4a 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Fields.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/MessageFields.java
@@ -16,12 +16,12 @@
 import com.google.inject.*;
 
 /**
- * Utility methods related to <code>{@link MessageField}</code>.
+ * Utility methods related to <code>{@link MessageField}</code>s.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
 @Singleton
-public class Fields {
+public class MessageFields {
 
   /**
    * Indicates whether the modifier of the given field is <code>{@link Modifier#OPTIONAL}</code>.
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/DataTypeValidator.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/DataTypeValidator.java
new file mode 100644
index 0000000..606cf00
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/DataTypeValidator.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 which accompanies this distribution, and is available at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.protobuf.validation;
+
+import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.FIELD_OPTION__VALUE;
+import static com.google.eclipse.protobuf.validation.Messages.*;
+
+import org.eclipse.xtext.naming.*;
+import org.eclipse.xtext.nodemodel.INode;
+import org.eclipse.xtext.validation.*;
+
+import com.google.eclipse.protobuf.model.util.*;
+import com.google.eclipse.protobuf.protobuf.*;
+import com.google.eclipse.protobuf.protobuf.Enum;
+import com.google.inject.Inject;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class DataTypeValidator extends AbstractDeclarativeValidator {
+
+  @Override public void register(EValidatorRegistrar registrar) {}
+
+  @Inject private FieldOptions fieldOptions;
+  @Inject private IQualifiedNameProvider fqnProvider;
+  @Inject private MessageFields messageFields;
+  @Inject private ModelFinder modelFinder;
+  @Inject private INodes nodes;
+
+  @Check public void checkValueOfDefaultTypeMatchesFieldType(FieldOption option) {
+    if (fieldOptions.isDefaultValueOption(option)) {
+      MessageField field = (MessageField) option.eContainer();
+      INode nodeForValueFeature = nodes.firstNodeForFeature(option, FIELD_OPTION__VALUE);
+      checkValueTypeMatchesFieldType(option.getValue(), nodeForValueFeature, field);
+    }
+  }
+
+  private  void checkValueTypeMatchesFieldType(Value value, INode nodeForValueFeature, MessageField field) {
+    if (messageFields.isString(field)) {
+      if (!(value instanceof StringLink)) {
+        error(expectedString, FIELD_OPTION__VALUE);
+      }
+      return;
+    }
+    if (messageFields.isBool(field)) {
+      if (!(value instanceof BooleanLink)) {
+        error(expectedTrueOrFalse, FIELD_OPTION__VALUE);
+      }
+      return;
+    }
+    Enum anEnum = modelFinder.enumTypeOf(field);
+    if (anEnum != null) {
+      if (!(value instanceof LiteralLink)) {
+        error(expectedIdentifier, FIELD_OPTION__VALUE);
+      }
+      Literal literal = ((LiteralLink) value).getTarget();
+      if (!anEnum.equals(literal.eContainer())) {
+        QualifiedName enumFqn = fqnProvider.getFullyQualifiedName(anEnum);
+        String literalName = nodes.textOf(nodeForValueFeature);
+        String msg = String.format(literalNotInEnum, enumFqn, literalName);
+        error(msg, FIELD_OPTION__VALUE);
+      }
+      return;
+    }
+  }
+}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.java
index 92f36f1..cef1009 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.java
@@ -17,6 +17,7 @@
 
   public static String expectedFieldName;
   public static String expectedFieldNumber;
+  public static String expectedIdentifier;
   public static String expectedString;
   public static String expectedSyntaxIdentifier;
   public static String expectedTrueOrFalse;
@@ -24,6 +25,7 @@
   public static String fieldNumbersMustBePositive;
   public static String importingNonProto2;
   public static String importNotFound;
+  public static String literalNotInEnum;
   public static String missingFieldNumber;
   public static String multiplePackages;
   public static String nonProto2;
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.properties b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.properties
index adfad66..497a7cd 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.properties
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.properties
@@ -1,5 +1,6 @@
 expectedFieldName = Expected field name.
 expectedFieldNumber = Expected field number.
+expectedIdentifier = Expected identifier.
 expectedString = Expected string.
 expectedSyntaxIdentifier = Expected syntax identifier.
 expectedTrueOrFalse = Expected "true" or "false".
@@ -7,6 +8,7 @@
 fieldNumbersMustBePositive = Field numbers must be positive integers.
 importingNonProto2 = Importing non-proto2 file (directly or indirectly.) This may cause errors related to unresolved references.
 importNotFound = Import \"%s\" was not found.
+literalNotInEnum = Enum type \"%s\" has no value named \"%s\".
 missingFieldNumber = Missing field number.
 multiplePackages = Multiple package definitions.
 nonProto2 = Deprecated syntax.  This parser only recognizes \"proto2\".
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
index 4009bed..911bbb4 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
@@ -27,16 +27,14 @@
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
-@ComposedChecks(validators = { ImportValidator.class })
+@ComposedChecks(validators = { DataTypeValidator.class, ImportValidator.class })
 public class ProtobufJavaValidator extends AbstractProtobufJavaValidator {
 
   public static final String SYNTAX_IS_NOT_PROTO2_ERROR = "syntaxIsNotProto2";
   public static final String INVALID_FIELD_TAG_NUMBER_ERROR = "invalidFieldTagNumber";
   public static final String MORE_THAN_ONE_PACKAGE_ERROR = "moreThanOnePackage";
 
-  @Inject private FieldOptions fieldOptions;
   @Inject private IndexedElements indexedElements;
-  @Inject private Fields properties;
   @Inject private Protobufs protobufs;
   @Inject private IQualifiedNameProvider qualifiedNameProvider;
   @Inject private ImportUriResolver uriResolver;
@@ -47,20 +45,6 @@
     }
   }
 
-  @Check public void checkDefaultValueType(FieldOption option) {
-    if (!fieldOptions.isDefaultValueOption(option)) return;
-    MessageField field = (MessageField) option.eContainer();
-    Value defaultValue = option.getValue();
-    if (properties.isString(field)) {
-      if (defaultValue instanceof StringLink) return;
-      error(expectedString, FIELD_OPTION__VALUE);
-    }
-    if (properties.isBool(field)) {
-      if (defaultValue instanceof BooleanLink) return;
-      error(expectedTrueOrFalse, FIELD_OPTION__VALUE);
-    }
-  }
-
   @Check public void checkImportIsResolved(Import anImport) {
     if (retryUntilItIsResolved(anImport)) return;
     error(format(importNotFound, anImport.getImportURI()), IMPORT__IMPORT_URI);
