Fill a large pasta pot ⅔ full with hot water. Place the pot over high heat on your stove. Add a couple of teaspoons of salt and cover the pot to let the water come to a boil.
While the pot is heating, shred the cheddar and grate the Parmesan, if needed, by placing a few chunks at a time in your blender. Set the cheese aside.
When the pot is boiling, add the pasta and give the pot a stir occasionally to prevent sticking. Cook the pasta until it's al dente (check the time listed on the package.)
Drain the cooked pasta in a colander in the sink and leave it there while you make the cheese sauce.
In the same pot you used for the pasta, melt the butter over medium-high heat on your stove. Add in the flour and whisk to combine. Continue cooking and stirring the roux for about 90 seconds.
Add the milk to the roux, whisking constantly. Continue whisking until the milk thickens and becomes glossy. This should take 3-4 minutes.
Lower the heat and add in the cheeses gradually, stirring after each addition until combined.
Add the salt, pepper and garlic powder, stirring to combine. Cut up the basil leaves with kitchen scissors and add them to the cheese sauce. Turn off the heat.
Return the cooked pasta to your pot with the cheese sauce. Stir to combine.
Serve immediately for best results. Top with paprika, if desired. Store leftovers in the refrigerator for up to five days. Reheat leftovers in the microwave with a little milk added, so the mac and cheese isn't dry.
Notes
Sharp cheddar works well, as opposed to extra sharp, which is too strong for this dish.
Shredding/grating the cheeses yourself (instead of buying pre-shredded cheese or Parmesan in a can) ensures the cheeses will melt more smoothly and not make the cheese sauce grainy.
The sauce makes just enough to coat the pasta. If you like your mac and cheese extra cheesy, make 1.5 times the sauce. The cheese sauce is great on veggies and ham.