Caro taaqui e brrodo,
Acho importante que este tema esteja rendendo
E eu vou colocar mais lenha na fogueira porque meu entendimento não bate com o seu. E para dar credibilidade a minha análise me basearei na
JLS (Java Language Specification) onde de fato cada um poderá ir (através do link :http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.5) e tirar suas próprias conclusões. Porque já vi gente aquí no GUJ dizendo a JVM no momento em que uma classe é carregada procura todos os literais de String e coloca-os no pool, sinceramente não sei de onde isso foi tirado, eu jamais li nada semelhante em lugar nenhum. Então lá vai:
// Considerando que não existe nada no pool de String:
public void testeString() {
String s1 = "fred"; // Cria um Objeto String no Heap e coloca o literal "fred" no pool apontando para o objeto que está no Heap. -------------> Primeiro Objeto criado.
String s2 = new String("marcos"); //Cria dois objetos String um para o new String e outro para "marcos" e insere "marcos" no pool. -------------> Segundo e Terceiro Objetos criados
String s3 = new String("fred"); // Cria novamente mais dois objetos como acima desta vez fred não vai mais para o pool, ele já esta lá. -------------> Quarto e Quinto Objeto criado
s1 = s1.concat(" silva"); // E por fim mais dois Objetos String criados: " silva" e "fred silva" ambos vão para o Heap e para o pool. -------------> Sexto e sétimo Objeto criado.
String s4 = s1;
}
7 objetos criados. 4 literais no pool.
É meu ponto de vista baseado na seguinte lógica:
Concluo aqui que todo literal referencia um Objeto String no Heap (Afinal é no Heap que os Objetos residem.) então se existe um literal também existe um Objeto String que ele referencia.
Então de acordo com a explicação do brrodo.
Quando foi inserido o literal "fread" no pool para que ele seja pego agora, brrodo? Para mim o literal "fred" é inserido no pool (agora) e também é criado um Objeto no Heap, baseada na afirmação acima.
Ao meu ver são dois novos objetos criados e inseridos no pool.
Baseado na citação acima concluo que new String() é um novo Objeto String criado e "marcos" passado como argumento ao construtor de String é um outro Objeto, já que literais são referencias a instancias da classe String. e o mesmo se aplica para a linha de código da citação abaixo:
E para finalizar:
Chamo aqui mais uma vez a documentação da JSL
Então nesse trecho de código são criados mais dois Objetos " silva" e "fred silva".
Mas essa é minha interpretação baseada na documentação da especificação da linguagem Java. Aconselho a cada um ir na fonte e tirar suas próprias conclusões. 
Boa Sorte a Todos!!