diff --git a/spec/compiler/codegen/macro_spec.cr b/spec/compiler/codegen/macro_spec.cr
index 8295f95aac6fd796646465001c2d53281f61de8e..49e11ab7bb17e3a1667130513d7856784b2a35a4 100755
--- a/spec/compiler/codegen/macro_spec.cr
+++ b/spec/compiler/codegen/macro_spec.cr
@@ -426,4 +426,24 @@ describe "Code gen: macro" do
       foo(1.5).to_i
       )).to_i.should eq(2)
   end
+
+  it "can use constants" do
+    run(%(
+      A = 1
+      {{ A }}
+      )).to_i.should eq(1)
+  end
+
+  it "can refer to types" do
+    run(%(
+      class Foo
+        def initialize(@x, @y)
+        end
+      end
+
+      Foo.new(1, 2)
+
+      {{ Foo.instance_vars.last.name }}
+      )).to_string.should eq("y")
+  end
 end
diff --git a/src/compiler/crystal/macros.cr b/src/compiler/crystal/macros.cr
index b8c18b169a1737606e65089dfe73c2f56883b270..d3404356514ae0b17799a5c030399baa51639620 100644
--- a/src/compiler/crystal/macros.cr
+++ b/src/compiler/crystal/macros.cr
@@ -368,6 +368,26 @@ module Crystal
         false
       end
 
+      def visit(node : Path)
+        matched_type = @scope.lookup_type(node)
+        unless matched_type
+          node.raise "undefined constant #{node}"
+        end
+
+        case matched_type
+        when Const
+          @last = matched_type.value
+        when Type
+          @last = MacroType.new(matched_type)
+        when ASTNode
+          @last = matched_type
+        else
+          node.raise "can't interpret #{node}"
+        end
+
+        false
+      end
+
       class ReplaceBlockVarsTransformer < Transformer
         def initialize(@vars)
         end