Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision 71806e0f8878eff4daf459af6ea5ef2c730185da)
+++ src/AST/Convert.cpp	(revision e4d7c1c357a5b1b2a17a980a263be977539b988b)
@@ -1764,4 +1764,5 @@
 			{ old->linkage.val },
 			GET_ACCEPT_1(base, Type),
+			old->hide == EnumDecl::EnumHiding::Hide ? ast::EnumDecl::EnumHiding::Hide : ast::EnumDecl::EnumHiding::Visible,
 			old->enumValues
 		);
Index: src/AST/Decl.hpp
===================================================================
--- src/AST/Decl.hpp	(revision 71806e0f8878eff4daf459af6ea5ef2c730185da)
+++ src/AST/Decl.hpp	(revision e4d7c1c357a5b1b2a17a980a263be977539b988b)
@@ -315,10 +315,11 @@
 	// enum (type_optional) Name {...} 
 	ptr<Type> base; // if isTyped == true && base.get() == nullptr, it is a "void" type enum
-
-	EnumDecl( const CodeLocation& loc, const std::string& name, bool isTyped = false, 
+	enum class EnumHiding { Visible, Hide } hide;
+
+	EnumDecl( const CodeLocation& loc, const std::string& name, bool isTyped = false,
 		std::vector<ptr<Attribute>>&& attrs = {}, Linkage::Spec linkage = Linkage::Cforall,
-		Type const * base = nullptr,
+		Type const * base = nullptr, EnumHiding hide = EnumHiding::Hide,
 		std::unordered_map< std::string, long long > enumValues = std::unordered_map< std::string, long long >() )
-	: AggregateDecl( loc, name, std::move(attrs), linkage ), isTyped(isTyped), base(base), enumValues(enumValues) {}
+	: AggregateDecl( loc, name, std::move(attrs), linkage ), isTyped(isTyped), base(base), hide(hide), enumValues(enumValues) {}
 
 	/// gets the integer value for this enumerator, returning true iff value found
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision 71806e0f8878eff4daf459af6ea5ef2c730185da)
+++ src/AST/Pass.impl.hpp	(revision e4d7c1c357a5b1b2a17a980a263be977539b988b)
@@ -686,9 +686,16 @@
 
 	if ( __visit_children() ) {
-		// unlike structs, traits, and unions, enums inject their members into the global scope
-		maybe_accept( node, &EnumDecl::base );
-		maybe_accept( node, &EnumDecl::params     );
-		maybe_accept( node, &EnumDecl::members    );
-		maybe_accept( node, &EnumDecl::attributes );
+		if ( node->hide == ast::EnumDecl::EnumHiding::Hide ) {
+			guard_symtab guard { *this };
+			maybe_accept( node, &EnumDecl::base );
+			maybe_accept( node, &EnumDecl::params     );
+			maybe_accept( node, &EnumDecl::members    );
+			maybe_accept( node, &EnumDecl::attributes );
+		} else {
+			maybe_accept( node, &EnumDecl::base );
+			maybe_accept( node, &EnumDecl::params     );
+			maybe_accept( node, &EnumDecl::members    );
+			maybe_accept( node, &EnumDecl::attributes );
+		}
 	}
 
