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 90ccad9..db89fd2 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
@@ -9,11 +9,13 @@
 package com.google.eclipse.protobuf.ui.labeling;
 
 import static com.google.eclipse.protobuf.scoping.ImportUriFixerAndResolver.URI_PREFIX;
+import static org.eclipse.jface.viewers.StyledString.DECORATIONS_STYLER;
+
+import org.eclipse.jface.viewers.StyledString;
 
 import com.google.eclipse.protobuf.protobuf.*;
 import com.google.eclipse.protobuf.ui.util.Properties;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
+import com.google.inject.*;
 
 /**
  * Registry of commonly used text in the 'Protocol Buffer' editor.
@@ -25,10 +27,7 @@
 
   @Inject private Properties properties;
 
-  private static final String LITERAL_FORMAT = "%s [%d]";
-  private static final String PROPERTY_FORMAT = "%s [%d] : %s";
-
-  public String labelFor(Object o) {
+  public Object labelFor(Object o) {
     if (o instanceof Import) {
       Import i = (Import) o;
       return labelFor(i);
@@ -48,21 +47,27 @@
     return null;
   }
 
-  private String labelFor(Import i) {
+  private Object labelFor(Import i) {
     String uri = i.getImportURI();
     if (uri == null || !uri.startsWith(URI_PREFIX)) return uri;
     return uri.substring(URI_PREFIX.length());
   }
 
-  private String labelFor(Literal l) {
-    return String.format(LITERAL_FORMAT, l.getName(), l.getIndex());
+  private Object labelFor(Literal l) {
+    StyledString text = new StyledString(l.getName());
+    String index = String.format(" [%d]", l.getIndex());
+    text.append(index, DECORATIONS_STYLER);
+    return text;
   }
 
-  private String labelFor(Property p) {
-    return String.format(PROPERTY_FORMAT, p.getName(), p.getIndex(), properties.typeNameOf(p));
+  private Object labelFor(Property p) {
+    StyledString text = new StyledString(p.getName());
+    String indexAndType = String.format(" [%d] : %s", p.getIndex(), properties.typeNameOf(p));
+    text.append(indexAndType, DECORATIONS_STYLER);
+    return text;
   }
 
-  private String labelFor(Protobuf p) {
+  private Object labelFor(Protobuf p) {
     // TODO show this text till I figure out how to hide 'Protobuf' node in outline view
     return "Protocol Buffer";
   }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/ProtobufLabelProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/ProtobufLabelProvider.java
index 71423d3..9ae89f9 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/ProtobufLabelProvider.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/ProtobufLabelProvider.java
@@ -30,7 +30,7 @@
   }
 
   @Override public Object text(Object o) {
-    String text = labels.labelFor(o);
+    Object text = labels.labelFor(o);
     return (text != null) ? text : super.text(o);
   }
 
