diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter_toValue_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter_toValue_Test.java
new file mode 100644
index 0000000..520e078
--- /dev/null
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter_toValue_Test.java
@@ -0,0 +1,65 @@
+/*
+ * 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.conversion;
+
+import static java.util.Arrays.asList;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+
+import java.util.Collection;
+
+import org.eclipse.xtext.nodemodel.INode;
+import org.junit.*;
+import org.junit.runner.RunWith;
+import org.junit.runners.*;
+import org.junit.runners.Parameterized.Parameters;
+
+import com.google.eclipse.protobuf.junit.core.XtextRule;
+
+/**
+ * Tests for <code>{@link FLOATValueConverter#toValue(String, INode)}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+@RunWith(Parameterized.class)
+public class FLOATValueConverter_toValue_Test {
+
+  @Rule public XtextRule xtext = new XtextRule();
+
+  private final String input;
+  private final Float expected;
+
+  @Parameters
+  public static Collection<Object[]> parameters() {
+    return asList(new Object[][] {
+      { "6.8", 6.8F },
+      { "-3.1", -3.1F },
+      { ".3", 0.3F }
+    });
+  }
+
+  public FLOATValueConverter_toValue_Test(String input, Float expected) {
+    this.input = input;
+    this.expected = expected;
+  }
+
+  private FLOATValueConverter converter;
+  private INode node;
+
+  @Before public void setUp() {
+    node = mock(INode.class);
+    converter = xtext.injector().getInstance(FLOATValueConverter.class);
+  }
+
+  @Test public void should_parse_hexadecimal_number() {
+    Float value = converter.toValue(input, node);
+    assertThat(value, equalTo(expected));
+  }
+}
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter_toValue_withInvalidInput_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter_toValue_withInvalidInput_Test.java
new file mode 100644
index 0000000..a2957f4
--- /dev/null
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter_toValue_withInvalidInput_Test.java
@@ -0,0 +1,63 @@
+/*
+ * 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.conversion;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.hamcrest.core.IsInstanceOf.instanceOf;
+import static org.junit.Assert.*;
+import static org.junit.rules.ExpectedException.none;
+import static org.mockito.Mockito.mock;
+
+import org.eclipse.xtext.conversion.ValueConverterException;
+import org.eclipse.xtext.nodemodel.INode;
+import org.junit.*;
+import org.junit.rules.ExpectedException;
+
+import com.google.eclipse.protobuf.junit.core.XtextRule;
+
+/**
+ * Tests for <code>{@link FLOATValueConverter#toValue(String, INode)}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class FLOATValueConverter_toValue_withInvalidInput_Test {
+
+  @Rule public XtextRule xtext = new XtextRule();
+  @Rule public ExpectedException thrown = none();
+
+  private FLOATValueConverter converter;
+  private INode node;
+
+  @Before public void setUp() {
+    node = mock(INode.class);
+    converter = xtext.injector().getInstance(FLOATValueConverter.class);
+  }
+
+  @Test public void should_throw_error_if_input_is_null() {
+    thrown.expect(ValueConverterException.class);
+    thrown.expectMessage("Couldn't convert empty string to float.");
+    converter.toValue(null, node);
+  }
+
+  @Test public void should_throw_error_if_input_is_empty() {
+    thrown.expect(ValueConverterException.class);
+    thrown.expectMessage("Couldn't convert empty string to float.");
+    converter.toValue("", node);
+  }
+
+  @Test public void should_throw_error_if_conversion_throws_NumberFormatException() {
+    try {
+      converter.toValue("abc", node);
+      fail("Expecting a " + ValueConverterException.class.getName());
+    } catch (ValueConverterException e) {
+      assertThat(e.getMessage(), equalTo("Couldn't convert 'abc' to float."));
+      assertThat(e.getCause(), instanceOf(NumberFormatException.class));
+    }
+  }
+}
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/INTValueConverter_toValue_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/INTValueConverter_toValue_Test.java
new file mode 100644
index 0000000..af29dea
--- /dev/null
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/conversion/INTValueConverter_toValue_Test.java
@@ -0,0 +1,74 @@
+/*
+ * 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.conversion;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.hamcrest.core.IsInstanceOf.instanceOf;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+import static org.junit.rules.ExpectedException.none;
+import static org.mockito.Mockito.mock;
+
+import org.eclipse.xtext.conversion.ValueConverterException;
+import org.eclipse.xtext.nodemodel.INode;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import com.google.eclipse.protobuf.junit.core.XtextRule;
+
+/**
+ * Tests for <code>{@link INTValueConverter#toString()}</code>.
+ * 
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class INTValueConverter_toValue_Test {
+
+  @Rule public XtextRule xtext = new XtextRule();
+  @Rule public ExpectedException thrown = none();
+
+  private INTValueConverter converter;
+  private INode node;
+
+  @Before public void setUp() {
+    node = mock(INode.class);
+    converter = xtext.injector().getInstance(INTValueConverter.class);
+  }
+  
+  @Test public void should_throw_error_if_input_is_null() {
+    thrown.expect(ValueConverterException.class);
+    thrown.expectMessage("Couldn't convert empty string to int.");
+    converter.toValue(null, node);
+  }
+
+  @Test public void should_throw_error_if_input_is_empty() {
+    thrown.expect(ValueConverterException.class);
+    thrown.expectMessage("Couldn't convert empty string to int.");
+    converter.toValue("", node);
+  }
+
+  @Test public void should_throw_error_if_conversion_throws_NumberFormatException() {
+    try {
+      converter.toValue("abc", node);
+      fail("Expecting a " + ValueConverterException.class.getName());
+    } catch (ValueConverterException e) {
+      assertThat(e.getMessage(), equalTo("Couldn't convert 'abc' to int."));
+      assertThat(e.getCause(), instanceOf(NumberFormatException.class));
+    }
+  }
+
+  @Test public void should_parse_integer() {
+    assertThat(converter.toValue("68", node), equalTo(68));
+  }
+
+  @Test public void should_parse_negative_integer() {
+    assertThat(converter.toValue("-2", node), equalTo(-2));
+  }
+}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
index 1c52aa3..c9f1c3a 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
@@ -128,7 +128,7 @@
   | false;
 
 NumberRef:
-  HexRef | IntRef | LongRef | FloatRef | DoubleRef;
+  HexRef | IntRef | FloatRef;
 
 HexRef:
   hex=HEX;
@@ -137,30 +137,12 @@
   int=INT;
 
 terminal INT returns ecore::EInt:
-  SIGNED_INT;
-
-LongRef:
-  long=LONG;
-
-terminal LONG returns ecore::ELong:
-  SIGNED_INT;
-
-terminal SIGNED_INT:
   ('-')? (NUMBER)+;
 
 FloatRef:
   float=FLOAT;
 
 terminal FLOAT returns ecore::EFloat:
-  DECIMAL;
-
-DoubleRef:
-  double=DOUBLE;
-
-terminal DOUBLE returns ecore::EDouble:
-  DECIMAL;
-
-terminal DECIMAL:
   ('-')? (NUMBER)* ('.' (NUMBER)+)?;
 
 StringRef:
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter.java
new file mode 100644
index 0000000..930b070
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/FLOATValueConverter.java
@@ -0,0 +1,44 @@
+/*
+ * 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.conversion;
+
+import static org.eclipse.xtext.util.Strings.isEmpty;
+
+import org.eclipse.xtext.conversion.ValueConverterException;
+import org.eclipse.xtext.conversion.impl.AbstractLexerBasedConverter;
+import org.eclipse.xtext.nodemodel.INode;
+
+/**
+ * Converts floating-point numbers to {@code float}s.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class FLOATValueConverter extends AbstractLexerBasedConverter<Float> {
+
+  /**
+   * Creates an {@code float} from the given input, if the given input represents a floating-point number.
+   * @param string the given input.
+   * @param node the parsed node including hidden parts.
+   * @return the new {@code float}.
+   * @throws ValueConverterException if the given input is {@code null}, empty or does not represent a floating-point 
+   * number.
+   */
+  public Float toValue(String string, INode node) throws ValueConverterException {
+    if (isEmpty(string)) throw new ValueConverterException("Couldn't convert empty string to float.", node, null);
+    try {
+      return Float.parseFloat(string);
+    } catch (NumberFormatException e) {
+      throw parsingError(string, node, e);
+    }
+  }
+
+  private ValueConverterException parsingError(String string, INode node, Exception cause) {
+    return new ValueConverterException("Couldn't convert '" + string + "' to float.", node, cause);
+  }
+}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/HEXValueConverter.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/HEXValueConverter.java
index 5901541..8f26d41 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/HEXValueConverter.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/HEXValueConverter.java
@@ -25,7 +25,7 @@
    * Creates an {@code int} from the given input, if the given input represents an hexadecimal number.
    * @param string the given input.
    * @param node the parsed node including hidden parts.
-   * @return the new integer.
+   * @return the new {@code int}.
    * @throws ValueConverterException if the given input is {@code null}, empty or does not represent an hexadecimal
    * number.
    */
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/INTValueConverter.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/INTValueConverter.java
new file mode 100644
index 0000000..2538d52
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/INTValueConverter.java
@@ -0,0 +1,43 @@
+/*
+ * 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.conversion;
+
+import static org.eclipse.xtext.util.Strings.isEmpty;
+
+import org.eclipse.xtext.conversion.ValueConverterException;
+import org.eclipse.xtext.conversion.impl.AbstractLexerBasedConverter;
+import org.eclipse.xtext.nodemodel.INode;
+
+/**
+ * Converts integer numbers to {@code int}s.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class INTValueConverter extends AbstractLexerBasedConverter<Integer> {
+
+  /**
+   * Creates an {@code int} from the given input, if the given input represents an integer number.
+   * @param string the given input.
+   * @param node the parsed node including hidden parts.
+   * @return the new {@code int}.
+   * @throws ValueConverterException if the given input is {@code null}, empty or does not represent an integer number.
+   */
+  public Integer toValue(String string, INode node) throws ValueConverterException {
+    if (isEmpty(string)) throw new ValueConverterException("Couldn't convert empty string to int.", node, null);
+    try {
+      return Integer.parseInt(string, 10);
+    } catch (NumberFormatException e) {
+      throw parsingError(string, node, e);
+    }
+  }
+
+  private ValueConverterException parsingError(String string, INode node, Exception cause) {
+    return new ValueConverterException("Couldn't convert '" + string + "' to int.", node, cause);
+  }
+}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/ProtobufTerminalConverters.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/ProtobufTerminalConverters.java
index c56b41b..9a6af27 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/ProtobufTerminalConverters.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/conversion/ProtobufTerminalConverters.java
@@ -18,16 +18,28 @@
  */
 public class ProtobufTerminalConverters extends DefaultTerminalConverters {
 
+  @Inject private FLOATValueConverter floatValueConverter;
   @Inject private HEXValueConverter hexValueConverter;
+  @Inject private INTValueConverter intValueConverter;
   @Inject private STRINGValueConverter stringValueConverter;
-
+  
+  @ValueConverter(rule = "FLOAT")
+  public IValueConverter<Float> FLOAT() {
+    return floatValueConverter;
+  }
+  
   @ValueConverter(rule = "HEX")
   public IValueConverter<Integer> HEX() {
     return hexValueConverter;
   }
+  
+  @ValueConverter(rule = "INT")
+  @Override public IValueConverter<Integer> INT() {
+    return intValueConverter;
+  }
 
   @ValueConverter(rule = "STRING")
-  public IValueConverter<String> STRING() {
+  @Override public IValueConverter<String> STRING() {
     return stringValueConverter;
   }
 }
