Механизм называется java modules. Вы указываете, какие пакеты экспортируются. Правда модулями далеко не все пользуются, а если не пользуются, то всё это игнорируется.
Второй вариант это использовать два jar. Первый jar клиент подключает как обычно, второй jar клиент подключает как runtime, в итоге при компиляции к классам второго jar он не будет иметь доступа.
Понятно, что если клиент захочет, то получит. Впрочем он и так получит, если захочет, через reflection или редактирование байткода (добавить модификатор public несложно) или ещё как-нибудь.
Если прям совсем не хотите, чтобы туда даже смотрели, можете обфусцировать этот пакет. Формально он останется public, но там никто ничего не поймёт.
А так — в рамках Java 8 ничего сделать нельзя. Если нужно использовать класс из пакета, он должен быть public. Если он public, то его может использовать кто угодно.