diff --git a/.codacy.yml b/.codacy.yml
index 61e804e4b7..6dff37e697 100644
--- a/.codacy.yml
+++ b/.codacy.yml
@@ -6,3 +6,4 @@ exclude_paths:
- "eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOread.java"
- "eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOwrite.java"
- "eo-runtime/src/test/java/EOorg/EOeolang/EOmallocTest.java"
+ - "eo-runtime/src/test/java/EOorg/EOeolang/EoClassesArePublicTest.java"
diff --git a/eo-runtime/pom.xml b/eo-runtime/pom.xml
index f7febb73c4..0f62a38d47 100644
--- a/eo-runtime/pom.xml
+++ b/eo-runtime/pom.xml
@@ -140,6 +140,11 @@ SOFTWARE.
test
+
+ com.google.guava
+ guava
+ test
+
diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOencage.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOencage.java
index 53032e2f9a..2cd8a46b57 100644
--- a/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOencage.java
+++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOencage.java
@@ -44,7 +44,7 @@
*/
@Versionized
@XmirObject(oname = "cage.encaged.encage")
-final class EOcage$EOencaged$EOencage extends PhDefault implements Atom {
+public final class EOcage$EOencaged$EOencage extends PhDefault implements Atom {
/**
* Ctor.
* @param sigma Sigma
diff --git "a/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EO\317\206.java" "b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EO\317\206.java"
index cd24460b54..8db4c61167 100644
--- "a/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EO\317\206.java"
+++ "b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EO\317\206.java"
@@ -43,7 +43,7 @@
*/
@Versionized
@XmirObject(oname = "cage.encaged.@")
-final class EOcage$EOencaged$EOφ extends PhDefault implements Atom {
+public final class EOcage$EOencaged$EOφ extends PhDefault implements Atom {
/**
* Ctor.
* @param sigma Sigma
diff --git "a/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EO\317\206.java" "b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EO\317\206.java"
index 54b390702e..57fc77b535 100644
--- "a/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EO\317\206.java"
+++ "b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EO\317\206.java"
@@ -42,7 +42,7 @@
*/
@Versionized
@XmirObject(oname = "cage.@")
-final class EOcage$EOφ extends PhDefault implements Atom {
+public final class EOcage$EOφ extends PhDefault implements Atom {
/**
* Ctor.
* @param sigma Sigma
diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOio/Input.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOio/Input.java
index 97a01b0eea..619fc1e24c 100644
--- a/eo-runtime/src/main/java/EOorg/EOeolang/EOio/Input.java
+++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOio/Input.java
@@ -39,7 +39,7 @@
* @since 0.28.0
*/
@Versionized
-public final class Input {
+final class Input {
/**
* Default input.
*/
diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOread.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOread.java
index 5f9ff39c03..2f4ff9bcb3 100644
--- a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOread.java
+++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOread.java
@@ -45,7 +45,7 @@
*/
@Versionized
@XmirObject(oname = "malloc.of.allocated.read")
-final class EOmalloc$EOof$EOallocated$EOread extends PhDefault implements Atom {
+public final class EOmalloc$EOof$EOallocated$EOread extends PhDefault implements Atom {
/**
* Ctor.
* @param sigma Sigma
diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOwrite.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOwrite.java
index ba97da96ad..61fd877b05 100644
--- a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOwrite.java
+++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EOallocated$EOwrite.java
@@ -46,7 +46,7 @@
*/
@Versionized
@XmirObject(oname = "malloc.of.allocated.write")
-final class EOmalloc$EOof$EOallocated$EOwrite extends PhDefault implements Atom {
+public final class EOmalloc$EOof$EOallocated$EOwrite extends PhDefault implements Atom {
/**
* Ctor.
* @param sigma Sigma
diff --git "a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206.java" "b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206.java"
index 11a3844fec..add7ab9fef 100644
--- "a/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206.java"
+++ "b/eo-runtime/src/main/java/EOorg/EOeolang/EOmalloc$EOof$EO\317\206.java"
@@ -44,7 +44,7 @@
*/
@Versionized
@XmirObject(oname = "malloc.of.@")
-final class EOmalloc$EOof$EOφ extends PhDefault implements Atom {
+public final class EOmalloc$EOof$EOφ extends PhDefault implements Atom {
/**
* Ctor.
* @param sigma Sigma
diff --git a/eo-runtime/src/test/java/EOorg/EOeolang/EOfailed.java b/eo-runtime/src/test/java/EOorg/EOeolang/EOfailed.java
index 8421c167a7..acab47730c 100644
--- a/eo-runtime/src/test/java/EOorg/EOeolang/EOfailed.java
+++ b/eo-runtime/src/test/java/EOorg/EOeolang/EOfailed.java
@@ -40,5 +40,5 @@
"JTCOP.RuleCorrectTestName",
"JTCOP.RuleInheritanceInTests"
})
-final class EOfailed extends PhDefault {
+public final class EOfailed extends PhDefault {
}
diff --git a/eo-runtime/src/test/java/EOorg/EOeolang/EoClassesArePublicTest.java b/eo-runtime/src/test/java/EOorg/EOeolang/EoClassesArePublicTest.java
new file mode 100644
index 0000000000..ebe4c05523
--- /dev/null
+++ b/eo-runtime/src/test/java/EOorg/EOeolang/EoClassesArePublicTest.java
@@ -0,0 +1,77 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2016-2024 Objectionary.com
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+/*
+ * @checkstyle PackageNameCheck (10 lines)
+ */
+package EOorg.EOeolang;
+
+import com.google.common.reflect.ClassPath;
+import com.jcabi.log.Logger;
+import java.io.IOException;
+import java.lang.reflect.Modifier;
+import java.util.Set;
+import java.util.stream.Collectors;
+import org.eolang.Phi;
+import org.hamcrest.MatcherAssert;
+import org.hamcrest.Matchers;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Test that all EO.. classes are public.
+ * @since 0.38
+ */
+@SuppressWarnings("JTCOP.RuleAllTestsHaveProductionClass")
+public class EoClassesArePublicTest {
+
+ @Test
+ @SuppressWarnings("JTCOP.RulePresentTense")
+ public void arePublic() throws IOException {
+ final Set> clazzes = ClassPath.from(ClassLoader.getSystemClassLoader())
+ .getAllClasses()
+ .stream()
+ .filter(clazz -> clazz.getPackageName().equals("EOorg.EOeolang"))
+ .map(ClassPath.ClassInfo::load)
+ .filter(EoClassesArePublicTest::isEoClass)
+ .collect(Collectors.toSet());
+ assert !clazzes.isEmpty();
+ Logger.info(this.getClass(), "Found %d EO classes", clazzes.size());
+ MatcherAssert.assertThat(
+ "All EO.. classes should be public",
+ clazzes.stream()
+ .filter(clazz -> !Modifier.isPublic(clazz.getModifiers()))
+ .collect(Collectors.toList()),
+ Matchers.empty()
+ );
+ }
+
+ /**
+ * Is EO.. class and is instance of {@link Phi}.
+ * @param clazz Class.
+ * @return True if is.
+ */
+ private static boolean isEoClass(final Class> clazz) {
+ return clazz.getSimpleName().startsWith("EO")
+ && Phi.class.isAssignableFrom(clazz);
+ }
+}