Apenas dois dos quatro modificadores de acesso se aplicam às classes: default e public. Ter acesso à classe B a partir de A significa (i) que você pode criar em A uma instância de B, (ii) fazer com que A estenda B, ou (iii) acessar as variáveis de instância de B, conforme seja permitido pelos seus modificadores de acesso. Se a classe A é declarada com o acesso default, então uma classe B que esteja em outro pacote não pode estender A, nem ter uma instância de A. Somente classes do mesmo pacote de A podem herdar ou instanciar A. Se a classe A é declarada com o modificador public, entao classes de outros pacotes podem estender A desde que o import apropriado seja declarado. Classes não podem ser declaradas com os modificadores private e protecteda, a não ser que sejam classes internas, neste caso, podem receber o modificador private. Vejamos uma exemplificação dos conceitos acima:
package com;
class A{}
package com2;
class B extends A{}
A classe B não compila, pois ela não tem acesso à classe A. Para compilar B, não é suficiente adicionar o import apropriado, pois a classe A{} continua tendo acesso default, ela é invisível para classes em outros pacotes. Para compilar B, ou colocamos A e B no mesmo pacote, ou declaramos A como pública e adicionamos o import apropiado na classe B.