diff --git a/spec/compiler/codegen/macro_spec.cr b/spec/compiler/codegen/macro_spec.cr
index 34e7d6ae4dcff8878e3dc64f3426a656cb5beb29..f4a9a9d0236fb409ee37baafeb1c44d85694a8be 100755
--- a/spec/compiler/codegen/macro_spec.cr
+++ b/spec/compiler/codegen/macro_spec.cr
@@ -238,6 +238,42 @@ describe "Code gen: macro" do
       )).to_i.should eq(1)
   end
 
+  it "expands def macro with @class_name with hierarchy" do
+    run(%(
+      class Reference
+        def to_s : String
+          {{ @class_name }}
+        end
+      end
+
+      class Foo
+      end
+
+      class Bar < Foo
+      end
+
+      (Bar.new || Foo.new).to_s
+      )).to_string.should eq("Bar")
+  end
+
+  it "expands def macro with @class_name with hierarchy (2)" do
+    run(%(
+      class Reference
+        def to_s : String
+          {{ @class_name }}
+        end
+      end
+
+      class Foo
+      end
+
+      class Bar < Foo
+      end
+
+      (Foo.new || Bar.new).to_s
+      )).to_string.should eq("Foo")
+  end
+
   it "allows overriding macro definition when redefining base class" do
     run(%(
       class Foo
diff --git a/src/compiler/crystal/macros.cr b/src/compiler/crystal/macros.cr
index 3a3b6134b7544b02f89470e1dbd78962599b44fd..7eec353aaedb92b9002b1e80ce2152c37a07453e 100644
--- a/src/compiler/crystal/macros.cr
+++ b/src/compiler/crystal/macros.cr
@@ -24,6 +24,7 @@ module Crystal
       the_macro.location = target_def.location
 
       owner = target_def.owner.not_nil!
+      owner = owner.base_type if owner.is_a?(HierarchyType)
 
       begin
         generated_source = @program.expand_macro owner, target_def.body