diff --git a/spec/compiler/codegen/class_spec.cr b/spec/compiler/codegen/class_spec.cr
index 84c17d49c55463c15b5387bee70fdcde7e5b702e..4b1edd9f74f1a330ba2ed12cfd76290e0dd56020 100644
--- a/spec/compiler/codegen/class_spec.cr
+++ b/spec/compiler/codegen/class_spec.cr
@@ -542,4 +542,22 @@ describe "Code gen: class" do
       ex.foo
       ))
   end
+
+  it "resolves type declaration when accessing instance var (#348)" do
+    build(%(
+      require "prelude"
+
+      lib C
+        type Foo = Int64[8]
+      end
+
+      class Bar
+        def initialize
+          @foo :: C::Foo
+        end
+      end
+
+      Bar.new.inspect
+      ))
+  end
 end
diff --git a/src/compiler/crystal/codegen/codegen.cr b/src/compiler/crystal/codegen/codegen.cr
index cf0fe5875aa028bbdfb9cccace5758e6b2c8c79c..18081b3e85939eb4066fa830d50cdfed9e55a0b7 100644
--- a/src/compiler/crystal/codegen/codegen.cr
+++ b/src/compiler/crystal/codegen/codegen.cr
@@ -330,7 +330,7 @@ module Crystal
               when Var
                 context.vars[node_exp.name].pointer
               when InstanceVar
-                instance_var_ptr (context.type as InstanceVarContainer), node_exp.name, llvm_self_ptr
+                instance_var_ptr (context.type.remove_typedef as InstanceVarContainer), node_exp.name, llvm_self_ptr
               when Path
                 accept(node_exp)
                 global_name = node_exp.target_const.not_nil!.llvm_name
diff --git a/src/compiler/crystal/semantic/type_inference.cr b/src/compiler/crystal/semantic/type_inference.cr
index 0c41e825d676bbfc6b32b514a9050d8211f0f254..4e79999a6d99f5164aecad0759d16f3c955042fa 100644
--- a/src/compiler/crystal/semantic/type_inference.cr
+++ b/src/compiler/crystal/semantic/type_inference.cr
@@ -279,7 +279,7 @@ module Crystal
     end
 
     def lookup_instance_var(node)
-      case scope = @scope
+      case scope = @scope.try &.remove_typedef
       when Nil
         node.raise "can't use instance variables at the top level"
       when Program
diff --git a/src/compiler/crystal/types.cr b/src/compiler/crystal/types.cr
index 83f642091c7aa651f5373282b7b9ae92493bc18a..f2bfcaa1ddc96c80648d95b6a10b53758abd01ec 100644
--- a/src/compiler/crystal/types.cr
+++ b/src/compiler/crystal/types.cr
@@ -1797,6 +1797,8 @@ module Crystal
     delegate pointer?, typedef
     delegate defs, typedef
     delegate macros, typedef
+    delegate passed_by_value?, typedef
+    delegate reference_like?, typedef
 
     def parents
       typedef_parents = typedef.parents