4 digits 7s display + 74HC595

Regarding my previous post about how to multiplex also the digits pins, this is what I tried
They are now handled through a second 595 chip.

int digits_number = 4;
int bytes = B0001;

 const int latchSegments = 7;
 const int clockSegments = 6;
 const int dataSegments = 5;
 
 const int latchDigits = 8;
 const int clockDigits = 9;
 const int dataDigits = 10;    
 
 byte byteRead;
  
 const byte digit[10] = 
 {
 B10000001, //0 -----------
 B11110011, //1 ----------
 B01001001, //2 ----------
 B01100001, //3 ----------
 B00110011, //4 ----------
 B00100101, //5 ----------
 B00000101, //6 ----------
 B11110001, //7 ----------
 B00000001, //8 ----------
 B00100001, //9 ----------
 };
     
 void setup() {
   
   Serial.begin(9600);
  
   pinMode(latchSegments, OUTPUT);
   pinMode(clockSegments, OUTPUT);
   pinMode(dataSegments, OUTPUT);
   
   pinMode(latchDigits, OUTPUT);
   pinMode(clockDigits, OUTPUT);
   pinMode(dataDigits, OUTPUT);      
  
   digitalWrite(dataDigits, HIGH);     

 }
     
 void update_display() {
   
     int d1 = 1;
     int d2 = 2;
     int d3 = 3;
     int d4 = 4;        

     bytes = B0001;     
     for(int j = 0;j<digits_number;j++)
     {     
       digitalWrite(latchSegments, LOW);
       switch(j)
       {
         case 0:
       shiftOut(dataSegments, clockSegments, MSBFIRST, digit[d1]); // 1
           break;
         case 1:
       shiftOut(dataSegments, clockSegments, MSBFIRST, digit[d2]); // 2
           break;
         case 2:
       shiftOut(dataSegments, clockSegments, MSBFIRST, digit[d3]); // 3 
           break;
         case 3:
       shiftOut(dataSegments, clockSegments, MSBFIRST, digit[d4]); // 4
           break;              
       }          

       digitalWrite(latchSegments, HIGH);         


       digitalWrite(latchDigits, LOW);
       shiftOut(dataDigits, clockDigits, MSBFIRST, bytes);          
       digitalWrite(latchDigits, HIGH);      

       digitalWrite(dataDigits, HIGH);            
       delay(4);
       digitalWrite(dataDigits, LOW);          

       bytes = bytes << 1;
     }
 }
     

 void loop ()
 {
         update_display();
         delay(1);
 }

And this is what I get (ignore last 2 digits, they are not wired)

As you can see there is some ghosting.

I think I understand what the problem is, every number is displayed in every display digit.
However, I don't know how to fix it, because if I increase the delay between the digits pin HIGH and LOW, then they start flickering.