Place the sugar, flour, cornstarch and salt in a small pot and whisk to combine.
Gradually whisk in the milk, taking care to whisk out any lumps.
Place over medium-low heat and bring to a low boil, stirring often.
Allow the mixture to boil for 1 to 2 minutes, stirring, until very thick.
Pass the mixture through a fine mesh strainer, and into a heat-safe container.
Refrigerate overnight.
Place the cooled mixture in a large mixing bowl, along with the lemon juice and vanilla, and whip on medium-high speed.
Whip in the softened butter on medium-high speed, a tablespoon at a time, allowing each addition to fully incorporate before adding the next.
Turn the mixer up to high speed, and continue to whip until doubled in volume and very fluffy.
Turn the mixer down to medium-low speed and beat in the cold cream cheese, a tablespoon at a time, allowing each addition to fully incorporate before adding the next (be careful not to overmix at this stage, or the mixture could become runny).